Как игнорировать первую строку данных при обработке данных 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]