读取 csv 文件时,有时第一行(或多行)是我们不想包含在数据中的标题。
如果我不需要next
在声明阅读器之前使用的标题中的数据(如果标题使用多于一行,我可以多次调用 next):
with open('myfile.csv', 'rb') as f:
next(f) #skip first row
reader = csv.reader(f)
for row in reader:
#process my data
Run Code Online (Sandbox Code Playgroud)
然而有时我不想在我的数据中包含标题但仍然需要它们的值。在这种情况下,我将其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
Run Code Online (Sandbox Code Playgroud)
这很有效,我很高兴。但我不确定这是否是“最佳实践”的使用方式,csv.reader
还有其他值得探索的方式。
这确实不是最佳实践 - 它无缘无故地读取内存中的整个文件。有趣的是,您的第一个代码段几乎没有什么可更改的以获取标题...
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
Run Code Online (Sandbox Code Playgroud)
所以你所要做的就是
with open('myfile.csv', 'rb') as f:
reader = csv.reader(f)
headers = next(reader)
for row in reader:
#process my data
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1532 次 |
最近记录: |