在阅读csv文件时,有时第一行(或多行)是我们不希望包含在我们数据中的标题。
如果我不需要标题中的数据,我只需在声明读者之前使用next
(如果多个行用于标题我可以多次调用):
with open('myfile.csv', 'rb') as f:
next(f) #skip first row
reader = csv.reader(f)
for row in reader:
#process my data
但有时我不想在我的数据中包含标题但仍需要它们的值。在这种情况下,我将csv.reader
转换为列表并分别处理标题。
with open('myfile.csv', 'rb') as f:
reader = list(csv.reader(f))
my_header = reader.pop(0) #remove header
for row in reader:
#process my data
这很有效,我很高兴。但我不确定它是否是最佳实践"使用csv.reader
的方式,还有其他值得探索的方法。
答案 0 :(得分:4)
这确实不是最好的做法 - 它没有任何理由在内存中读取整个文件。有趣的是,你的第一个片段几乎没有什么可以改变来获得标题......
next(iterator)
返回“当前”元素:
>>> it = iter(["hello", "world"])
>>> next(it)
'hello'
>>> next(it)
'world'
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
所以你要做的就是
with open('myfile.csv', 'rb') as f:
reader = csv.reader(f)
headers = next(reader)
for row in reader:
#process my data
FWIW,你跳过第一段代码中“第一行”的方式很脆弱 - 你实际上正在跳过第一行行,这不一定是第一行行(某些csv格式在行中嵌入换行符),因此对于您实际需要的“无标题”版本:
with open('myfile.csv', 'rb') as f:
reader = csv.reader(f)
next(reader) # skip first row
for row in reader:
#process my data
答案 1 :(得分:0)
使用标题行组织的csv文件的简单方法,然后是值:csv + DictReader 例如:
with open ('myfile.csv', 'r') as csv_file:
csv_reader = csv.DictReader (csv_file)
for row in csv_reader:
print (row.get ('column1')) # print the value of column1 without title
使用此方法,您可以忽略标题行并精确定位所需的数据,并且您的代码将更清晰。 给我一个回报,稍后再见。