Python通过CSV循环,但两次写入标题行

时间:2013-08-05 03:01:44

标签: python csv python-2.7

我的csv文件在标题行中包含不需要的第一个字符,但第一列除外。 while循环从标题中删除第一个字符,并将新标题行写入新文件(按计数器退出)。然后,else语句将其余行写入新文件。问题是else语句以标题行开头并第二次写入。有没有办法让别人开始下一行而不打破for迭代器?实际文件是21列乘400,000+行。不需要的字符是单个空格,但我在下面的示例中使用了*以便于查看。谢谢你的帮助!

file.csv =

一,* B *,C,* d

1,2,3,4

import csv

reader = csv.reader(open('file.csv', 'rb'))

writer = csv.writer(open('file2.csv','wb'))

count = 0

for row in reader:
    while (count <= 0):
        row[1]=row[1][1:]
        row[2]=row[2][1:]
        row[3]=row[3][1:]
        writer.writerow([row[0], row[1], row[2], row[3]])
        count = count + 1
    else:
        writer.writerow([row[0], row[1], row[2], row[3]])

4 个答案:

答案 0 :(得分:1)

如果您只想更改标题并复制剩余的行而不做更改:

with open('file.csv', 'r') as src, open('file2.csv', 'w') as dst:
    dst.write(next(src).replace(" ", ""))     # delete whitespaces from header
    dst.writelines(line for line in src)

如果您想进行其他转换,可以执行thisthis问题。

答案 1 :(得分:0)

如果您要删除空格,可以使用:

string.replace(" ", "")

答案 2 :(得分:0)

嗯......看起来你的逻辑有点落后了。我想,有点清洁,检查你是否在第一排。另外,删除空格的一种更惯用的方法是使用字符串的lstrip方法,不带参数来删除前导空格。

为什么不使用枚举并检查你的行是否是标题?

import csv

reader = csv.reader(open('file.csv', 'rb'))

writer = csv.writer(open('file2.csv','wb'))

for i, row in enumerate(reader):
    if i == 0:            
        writer.writerow([row[0], 
                         row[1].lstrip(), 
                         row[2].lstrip(), 
                         row[3].lstrip()])
    else:
        writer.writerow([row[0], row[1], row[2], row[3]])

答案 3 :(得分:0)

如果您有21列,则不想编写row[0], ... , row[21]。此外,您希望在打开文件后关闭它们。 .next()获取标题。 strip()可让您灵活地删除不需要的前导和尾随字符。

import csv

file = 'file1.csv'
newfile = open('file2.csv','wb')
writer = csv.writer(newfile)

with open(file, 'rb') as f:
  reader = csv.reader(f)
  header = reader.next()

  newheader = []  
  for c in header:
    newheader.append(c.strip(' '))
    writer.writerow(newheader)  

  for r in reader:
    writer.writerow(r)  

newfile.close()