使用Python编辑csv文件时跳过标题

185 python csv python-2.7

我使用下面引用的代码使用Python编辑csv.代码中调用的函数形式代码的上半部分.

问题:我希望下面引用的代码从第2行开始编辑csv,我希望它排除包含标题的第1行.现在它只在第一行应用函数,我的标题行正在改变.

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()
Run Code Online (Sandbox Code Playgroud)

我试图通过初始化row变量来解决这个问题,1但它没有用.

请帮我解决这个问题.

Mar*_*ers 331

您的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.
Run Code Online (Sandbox Code Playgroud)

如果你想将标题写入未处理的输出文件,那也很容易,将输出传递next()writer.writerow():

headers = next(reader, None)  # returns the headers or `None` if the input is empty
if headers:
    writer.writerow(headers)
Run Code Online (Sandbox Code Playgroud)

  • 另一种方法是使用`for is in is is is(read,1,None)` - 虽然对于大多数简单的"跳过一行"作业而言比"next"更明确,但是跳过多个标题行(或者只获取某些块等). ..)它非常方便 (22认同)

Cha*_*ski 108

解决此问题的另一种方法是使用DictReader类,该类"跳过"标题行并使用它来允许命名索引.

鉴于"foo.csv"如下:

FirstColumn,SecondColumn
asdf,1234
qwer,5678
Run Code Online (Sandbox Code Playgroud)

像这样使用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'])
Run Code Online (Sandbox Code Playgroud)

  • 我觉得这是真正的答案,因为这个问题似乎是[XY问题]的一个例子(http://mywiki.wooledge.org/XyProblem). (19认同)
  • 重要的是要注意,这仅在构造DictReader时省略字段名称参数时才有效。根据文档:`如果省略fieldnames参数,则文件f第一行中的值将用作字段名。`参见https://docs.python.org/2/library/csv.html (3认同)
  • 绝对是DictReader的出路 (2认同)

bit*_*ang 9

只需使用 next() 迭代一次

with open(filename) as file:

    csvreaded = csv.reader(file)
    header = next(csvreaded)

    for row in csvreaded:
        empty_list.append(row) #your csv list without header  
Run Code Online (Sandbox Code Playgroud)

或在 reader 对象末尾使用 [1:]

with open(filename) as file:

    csvreaded = csv.reader(file)
    header = next(csvreaded)

    for row in csvreaded[1:]:
        empty_list.append(row) #your csv list without header  
Run Code Online (Sandbox Code Playgroud)


Kat*_*iel 6

row=1不会改变任何东西,因为你只是用循环的结果覆盖它.

你想要next(reader)跳过一行.