问题:使用Python编辑CSV文件时跳过标题
我正在使用以下引用的代码使用Python编辑CSV。代码中调用的函数构成了代码的上部。
问题:我希望下面引用的代码从第二行开始编辑csv,我希望它排除包含标题的第一行。现在,它仅在第一行上应用函数,并且我的标题行正在更改。
in_file = open("tmob_notcleaned.csv", "rb")
reader = csv.reader(in_file)
out_file = open("tmob_cleaned.csv", "wb")
writer = csv.writer(out_file)
row = 1
for row in reader:
row[13] = handle_color(row[10])[1].replace(" - ","").strip()
row[10] = handle_color(row[10])[0].replace("-","").replace("(","").replace(")","").strip()
row[14] = handle_gb(row[10])[1].replace("-","").replace(" ","").replace("GB","").strip()
row[10] = handle_gb(row[10])[0].strip()
row[9] = handle_oem(row[10])[1].replace("Blackberry","RIM").replace("TMobile","T-Mobile").strip()
row[15] = handle_addon(row[10])[1].strip()
row[10] = handle_addon(row[10])[0].replace(" by","").replace("FREE","").strip()
writer.writerow(row)
in_file.close()
out_file.close()
我试图通过将row
变量初始化为来解决此问题,1
但没有成功。
请帮助我解决这个问题。
回答 0
您的reader
变量是可迭代的,通过循环它可以检索行。
要使其在循环前跳过一项,只需调用next(reader, None)
并忽略返回值即可。
您还可以稍微简化代码;使用打开的文件作为上下文管理器可以自动关闭它们:
with open("tmob_notcleaned.csv", "rb") as infile, open("tmob_cleaned.csv", "wb") as outfile:
reader = csv.reader(infile)
next(reader, None) # skip the headers
writer = csv.writer(outfile)
for row in reader:
# process each row
writer.writerow(row)
# no need to close, the files are closed automatically when you get to this point.
如果您想将标头写入未经处理的输出文件,也很容易,请将输出传递next()
给writer.writerow()
:
headers = next(reader, None) # returns the headers or `None` if the input is empty
if headers:
writer.writerow(headers)
回答 1
解决此问题的另一种方法是使用DictReader类,该类“跳过”标题行并将其用于允许命名索引。
给定“ foo.csv”,如下所示:
FirstColumn,SecondColumn
asdf,1234
qwer,5678
像这样使用DictReader:
import csv
with open('foo.csv') as f:
reader = csv.DictReader(f, delimiter=',')
for row in reader:
print(row['FirstColumn']) # Access by column header instead of column number
print(row['SecondColumn'])
回答 2
在做 row=1
不会改变任何东西,因为您只会用循环的结果覆盖它。
您要next(reader)
跳过一行。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。