0

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

文件.csv =

A 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

4 回答 4

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)

如果你想做额外的转换,你可以做类似这个这个问题的事情。

于 2013-08-05T04:16:52.467 回答
0

如果您只想删除空格,则可以使用:

string.replace(" ", "")
于 2013-08-05T03:27:53.837 回答
0

嗯...看来您的逻辑可能有点落后。我认为更清洁一点,以检查您是否首先在第一排。此外,删除空格的一种更惯用的方法是使用字符串的lstrip方法(不带参数)来删除前导空格。

为什么不使用 enumerate 并检查您的行是否是标题?

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]])
于 2013-08-05T03:39:56.113 回答
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()
于 2013-08-05T04:03:29.887 回答