programing

CSV 데이터를 처리할 때 데이터의 첫 번째 줄을 무시하는 방법은 무엇입니까?

iphone6s 2023. 8. 5. 09:59
반응형

CSV 데이터를 처리할 때 데이터의 첫 번째 줄을 무시하는 방법은 무엇입니까?

CSV 데이터 열에서 최소 숫자를 인쇄해 달라고 Python에게 요청하고 있지만, 맨 위 행은 열 번호이며, 맨 위 행은 Python이 고려하지 않았으면 합니다.어떻게 하면 파이썬이 첫 번째 줄을 무시하는지 확인할 수 있습니까?

지금까지의 코드는 다음과 같습니다.

import csv

with open('all16.csv', 'rb') as inf:
    incsv = csv.reader(inf)
    column = 1                
    datatype = float          
    data = (datatype(column) for row in incsv)   
    least_value = min(data)

print least_value

코드만 주는 것이 아니라 당신이 무엇을 하고 있는지도 설명해 주시겠습니까?저는 파이썬에 매우 익숙하지 않아서 제가 모든 것을 이해하고 있는지 확인하고 싶습니다.

의 예를 사용할 수 있습니다.csvCSV 파일의 형식을 추론하고 헤더 행이 기본 제공과 함께 있는지 여부를 탐지하는 모듈의 클래스next()필요한 경우에만 첫 번째 행을 건너뛸 수 있는 기능:

import csv

with open('all16.csv', 'r', newline='') as file:
    has_header = csv.Sniffer().has_header(file.read(1024))
    file.seek(0)  # Rewind.
    reader = csv.reader(file)
    if has_header:
        next(reader)  # Skip header row.
    column = 1
    datatype = float
    data = (datatype(row[column]) for row in reader)
    least_value = min(data)

print(least_value)

부터datatype그리고.column당신의 예에서 하드 코드화되어 있습니다. 처리하는 것이 약간 더 빠를 것입니다.row다음과 같이:

    data = (float(row[1]) for row in reader)

참고: 위의 코드는 Python 3.x용입니다. Python 2.x의 경우 표시된 것 대신 다음 행을 사용하여 파일을 엽니다.

with open('all16.csv', 'rb') as file:

첫 번째 줄을 건너뛰려면 다음 전화를 하십시오.

next(inf)

Python의 파일은 줄 위에서 반복됩니다.

파이썬 요리책에서 빌렸어요
보다 간결한 템플릿 코드는 다음과 같습니다.

import csv
with open('stocks.csv') as f:
    f_csv = csv.reader(f) 
    headers = next(f_csv) 
    for row in f_csv:
        # Process row ...

유사한 사용 사례에서 저는 실제 열 이름이 있는 행 앞에서 성가신 행을 건너뛰어야 했습니다.이 해결책은 잘 작동했습니다.먼저 파일을 읽은 다음 목록을 다음으로 전달합니다.csv.DictReader.

with open('all16.csv') as tmp:
    # Skip first line (if any)
    next(tmp, None)

    # {line_num: row}
    data = dict(enumerate(csv.DictReader(tmp)))

일반적으로 사용할 수 있습니다.next(incsv)반복기를 한 줄 전진시키므로 헤더를 건너뜁니다.다른 하나는 다음과 같습니다(30개 행을 건너뛰고 싶었다고 가정).

from itertools import islice
for row in islice(incsv, 30, None):
    # process

csv를 사용합니다.CSV 대신 DictReader.독자.field names 매개 변수를 생략하면 csv 파일의 첫 번째 행에 있는 값이 필드 이름으로 사용됩니다.그러면 행["1"] 등을 사용하여 필드 값에 액세스할 수 있습니다.

파이썬 2.x

csvreader.next()

현재 방언에 따라 구문 분석된 독서자의 반복 가능한 개체의 다음 행을 목록으로 반환합니다.

csv_data = csv.reader(open('sample.csv'))
csv_data.next() # skip first row
for row in csv_data:
    print(row) # should print second row

파이썬 3.x

csvreader.__next__()

현재 방언에 따라 구문 분석된 독서자 대상 개체의 다음 행을 목록으로 반환합니다(개체가 독서자()에서 반환된 경우) 또는 딕트(DictReader 인스턴스인 경우).보통 이것을 다음(읽기)으로 불러야 합니다.

csv_data = csv.reader(open('sample.csv'))
csv_data.__next__() # skip first row
for row in csv_data:
    print(row) # should print second row

이것은 매우 오래된 질문일 수 있지만 판다와 함께 우리는 매우 쉬운 해결책을 가지고 있습니다.

import pandas as pd

data=pd.read_csv('all16.csv',skiprows=1)
data['column'].min()

skiprows=1을 사용하면 첫 번째 행을 건너뛰고 data['column'].min을 사용하여 최소값을 찾을 수 있습니다.

Python 3 CSV 모듈에 대한 설명서는 다음과 같은 예를 제공합니다.

with open('example.csv', newline='') as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
    # ... process CSV file contents here ...

Sniffer에서는 CSV 파일에 대한 많은 정보를 자동으로 검색하려고 합니다.당신은 그것을 명시적으로 부를 필요가 있습니다.has_header()파일에 헤더 줄이 있는지 확인하는 방법입니다.그런 경우 CSV 행을 반복할 때 첫 번째 행을 건너뜁니다.다음과 같이 할 수 있습니다.

if sniffer.has_header():
    for header_row in reader:
        break
for data_row in reader:
    # do something with the row

새 'pandas' 패키지가 'csv' 패키지보다 더 관련성이 있을 수 있습니다.아래 코드는 CSV 파일을 읽습니다. 기본적으로 첫 번째 줄을 열 머리글로 해석하고 열 전체의 최소값을 찾습니다.

import pandas as pd

data = pd.read_csv('all16.csv')
data.min()

제가 하고 있던 일과 관련이 있기 때문에 여기서 공유하겠습니다.

헤더가 있는지 확신할 수 없고 스니퍼와 다른 것들도 수입하고 싶지 않다면 어떻게 하시겠습니까?

목록이나 배열을 인쇄하거나 추가하는 등의 작업이 기본적인 경우 if 문을 사용하면 됩니다.

# Let's say there's 4 columns
with open('file.csv') as csvfile:
     csvreader = csv.reader(csvfile)
# read first line
     first_line = next(csvreader)
# My headers were just text. You can use any suitable conditional here
     if len(first_line) == 4:
          array.append(first_line)
# Now we'll just iterate over everything else as usual:
     for row in csvreader:
          array.append(row)

미니 포장지 라이브러리도 그 일을 할 수 있을 겁니다.

>>> import pyexcel as pe
>>> data = pe.load('all16.csv', name_columns_by_row=0)
>>> min(data.column[1])

한편, 헤더 열 인덱스 1이 무엇인지 알고 있는 경우(예: "열 1") 대신 다음 작업을 수행할 수 있습니다.

>>> min(data.column["Column 1"])

저에게 가장 쉬운 방법은 레인지를 사용하는 것입니다.

import csv

with open('files/filename.csv') as I:
    reader = csv.reader(I)
    fulllist = list(reader)

# Starting with data skipping header
for item in range(1, len(fulllist)): 
    # Print each row using "item" as the index value
    print (fulllist[item])  

csvreader를 목록으로 변환한 다음 첫 번째 요소를 팝합니다.

import csv        

with open(fileName, 'r') as csvfile:
        csvreader = csv.reader(csvfile)
        data = list(csvreader)               # Convert to list
        data.pop(0)                          # Removes the first row

        for row in data:
            print(row)

원치 않는 첫 번째 줄을 제거하기 위해 꼬리를 사용할 것입니다.

tail -n +2 $INFIL | whatever_script.py 

[1:]만 추가

아래의 예:

data = pd.read_csv("/Users/xyz/Desktop/xyxData/xyz.csv", sep=',', header=None)**[1:]**

그것은 iPython에서 나에게 효과가 있습니다.

파이썬 3.X

UTF8 BOM + HEADER 처리

그것은 꽤 좌절스러웠습니다.csv모듈이 헤더를 쉽게 가져올 수 없습니다. 또한 UTF-8 BOM(첫 번째 charin file)에 버그가 있습니다.이 기능은 다음 기능만 사용하여 사용할 수 있습니다.csv모듈:

import csv

def read_csv(self, csv_path, delimiter):
    with open(csv_path, newline='', encoding='utf-8') as f:
        # https://bugs.python.org/issue7185
        # Remove UTF8 BOM.
        txt = f.read()[1:]

    # Remove header line.
    header = txt.splitlines()[:1]
    lines = txt.splitlines()[1:]

    # Convert to list.
    csv_rows = list(csv.reader(lines, delimiter=delimiter))

    for row in csv_rows:
        value = row[INDEX_HERE]

간단한 솔루션은 csv를 사용하는 것입니다.DictReader()

import csv

def read_csv(file): with open(file, 'r') as file:
    reader = csv.DictReader(file)
    for row in reader:
        print(row["column_name"])  # Replace the name of column header.

언급URL : https://stackoverflow.com/questions/11349333/how-to-ignore-the-first-line-of-data-when-processing-csv-data

반응형