2017-12-21 18 views
0

csv file에서 목록이나 번호가 매겨진 배열을 만드는 더 좋은 방법이 있습니까? 내가 어떻게하는지 묻는 것은 아래 코드에서했던 것보다 더 잘 수행하고 구문 분석하는 방법이다.목록 또는 배열로 CSV를 구문 분석하는 더 나은 방법

fname = open("Computers discovered recently by discovery method.csv").readlines() 
lst = [elt.strip().split(",")[8:] for elt in fname if elt != "\n"][4:] 

lst2 = [] 
for row in lst: 
    print(row) 
    if row[0].startswith("SMZ-") or row[0].startswith("MTR-"): 
     lst2.append(row) 

print(*lst2, sep = "\n") 
+0

팬더 데이터 프레임은 어떻습니까? –

+0

@Garbage 나는 아직 그들을 배웠다.예제는 환영합니다 – user2978216

답변

0

모든 가능한 예외 및 CSV 형식 이상한 문제를 해결하고 싶지 않으면 수동으로 CSV 구조를 구문 분석해서는 안됩니다. 파이썬은 그 측면에서 그 csv 모듈에 대해 다뤘습니다.

주요 문제는 귀하의 데이터에서 유래합니다. 첫 번째 구조가 시작되는 곳을 먼저 찾아야하기 때문에 하나의 파일에 2 개의 다른 CSV 구조가있는 것으로 보입니다. 또한 코드에서 Details_Table0_Netbios_Name0 전에 모든 열을 필터링하고 이 SMZ- 또는 MTR-으로 시작하는 행만 포함하려는 것 같습니다. 따라서 다음과 같이됩니다.

import csv 

with open("Computers discovered recently by discovery method.csv") as f: 
    reader = csv.reader(f) # create a CSV reader 
    for row in reader: # skip the lines until we encounter the second CSV structure/header 
     if row and row[0] == "Header_Table0_Netbios_Name0": 
      break 
    index = row.index("Details_Table0_Netbios_Name0") # find where your columns begin 
    result = [] # storage for the rows we're interested in 
    for row in reader: # read the rest of the CSV row by row 
     if row and row[index][:4] in {"SMZ-", "MTR-"}: # only include these rows 
      result.append(row[index:]) # trim and append to the `result` list 

print(result[10]) # etc. 
# ['MTR-PC0BXQE6-LB', 'PR2', 'anisita', 'VALUEADDCO', 'VALUEADDCO', 'Heartbeat Discovery', 
# '07.12.2017 17:47:51', '13'] 

트릭을해야합니다.

+0

고마워요! 또한 댓글은 매우 유용합니다. – user2978216

1

나는 당신이 원하는 것을 확실하지 않다 그러나 이것은 선으로 csv로 라인을 읽고 목록

+0

시도해 주셔서 감사합니다 : D 첫 번째 게시물에 csv 파일에 대한 링크가 있습니다. 코드를 다운로드하여 사용해 볼 수 있습니다. (스포일러 경고 : 작동하지 않습니다) – user2978216

+0

@ user2978216 csv 파일을 직접 구문 분석하는 것보다 csv 라이브러리를 사용하는 것이 좋습니다. csv 라이브러리는 필요한 경우 범용 방언과 사용자 정의 방언을 지원합니다. https://docs.python.org/3/library/csv.html – antonagestam

+0

@ user2978216 CSV의 처음 3 줄을 지우고 작동 시키면 – funkyFunk

0

샘플 코드

import csv 
csv_file = 'sample.csv' 
with open(csv_file) as fh: 
    reader = csv.reader(fh) 
    for row in reader: 
    print(row) 
로 저장해야이

import csv 
with open("Computers discovered recently by discovery method.csv", 'r') as f: 
    reader = csv.reader(f) 
    ll = list(reader) 

print (ll) 

시도

sample.csv

name,age,salary 
clado,20,25000 
student,30,34000 
sam,34,32000 
2

당신은 항상 Pandas를 사용할 수 있습니다. 예를 들어,

import pandas as pd 
import numpy as np 

df = pd.read_csv('pandas_dataframe_importing_csv/example.csv') 

변환하려면 원하는 숫자 유형으로 변환해야합니다. 다음

result = numpy.array(list(df)).astype("float") 

당신도 수행 할 수 있습니다 :

from numpy import genfromtxt 
my_data = genfromtxt('my_file.csv', delimiter=',') 
+0

이 해당 numpy 배열을 얻습니다. 'result = df.values ' – buenaonda

+0

사실, 일부 편집을 원한다면'astype()'를 추가했습니다. – andrewnagyeb

1

당신은 당신이 샘플 파일에서 제대로 작동하기 위해 팬더를 사용하여 헤더 열을 지정할 수 있습니다 난 당신이 한 줄 전체를 쓸 수있는 것 같아요

import pandas as pd 

df = pd.read_csv('Computers discovered recently by discovery method.csv', header=2) 

당신은 사용하여 내용을 확인할 수 있습니다

>>> df.head() 

당신은

>>> df.columns 

를 사용하여 헤더를 확인하실 수 있습니다 그리고 당신은 그것은 구문 분석하고 CSV 파일을 읽을 수있는 많은 옵션과 함께 제공

>>> np_arr = df.values 

사용할 수 있습니다 numpy 배열로 변환 할 수 있습니다. 자세한 내용은 다음을 확인하십시오. docs