Как игнорировать первую строку данных при обработке данных CSV?

Я прошу Python напечатать минимальное число из столбца данных 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

Не могли бы вы также объяснить, что вы делаете, а не просто дать код? Я очень новичок в Python и хочу убедиться, что все понимаю.

Ответ 1

Вы могли бы использовать экземпляр класса Sniffer модуля csv, чтобы определить формат файла CSV и определить, присутствует ли строка заголовка вместе со встроенной функцией 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:

Ответ 2

Чтобы пропустить первую строку, просто вызовите:

next(inf)

Файлы в Python являются итераторами по строкам.

Ответ 3

Обычно вы используете next(incsv), который продвигает итератор на одну строку, поэтому вы пропускаете заголовок. Другой (скажем, вы хотели пропустить 30 строк):

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

Ответ 4

В аналогичном случае мне пришлось пропустить раздражающие строки перед строкой с моими фактическими именами столбцов. Это решение работало хорошо. Сначала прочтите файл, затем перейдите к 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)))

Ответ 5

Заимствовано из поваренной книги питона,
Более краткий шаблонный код может выглядеть так:

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

Ответ 6

используйте csv.DictReader вместо csv.Reader. Если параметр fieldnames опущен, значения в первой строке csvfile будут использоваться в качестве имен полей. вы могли бы получить доступ к значениям полей, используя строку [ "1" ] и т.д.

Ответ 7

Новый пакет "pandas" может быть более релевантным, чем "csv". В приведенном ниже коде будет читаться файл CSV, по умолчанию интерпретируя первую строку как заголовок столбца и найдите минимальное количество столбцов.

import pandas as pd

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

Ответ 8

Хорошо, моя мини-оберточная библиотека выполнила бы эту работу.

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

Между тем, если вы знаете, какой индекс столбца заголовка один, например "Столбец 1", вы можете сделать это вместо:

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

Ответ 9

Для меня самый простой способ - использовать диапазон.

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])  

Ответ 10

Поскольку это связано с чем-то, что я делал, я поделюсь здесь.

Что, если мы не уверены, есть ли заголовок, и вы тоже не хотите импортировать сниффера и другие вещи?

Если ваша задача является базовой, например, печать или добавление к списку или массиву, вы можете просто использовать оператор if:

# Let say there 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)

Ответ 11

документация для модуля 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

Ответ 12

Я бы использовал хвост, чтобы избавиться от нежелательной первой строки:

tail -n +2 $INFIL | whatever_script.py 

Ответ 13

просто добавьте [1:]

пример ниже:

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

который работает для меня в iPython

Ответ 14

Python 3.X

Обрабатывает спецификацию UTF8 + HEADER

Было довольно неприятно, что модуль csv не мог легко получить заголовок, есть также ошибка с спецификацией UTF-8 (первый char в файле). Это работает для меня, используя только модуль 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]