【问题标题】:Python loops through CSV, but writes header row twicePython循环通过CSV,但两次写入标题行
【发布时间】:2013-08-05 03:01:43
【问题描述】:

我的 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]])

【问题讨论】:

  • 删除这些不需要的字符——这是您代码的唯一目的吗?
  • 是的,但是,这只是优化一个非常大的数据集以导入数据库@djas 的一小部分

标签: python csv python-2.7


【解决方案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 之类的问题。

【讨论】:

  • 此代码将删除标题中的 所有 个空格 -- 这是您可能想做也可能不想做的事情。
【解决方案2】:

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

string.replace(" ", "")

【讨论】:

    【解决方案3】:

    嗯...您的逻辑似乎有点落后。我认为更清洁一点,以检查您是否首先在第一排。此外,删除空格的一种更惯用的方法是使用字符串的 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]])
    

    【讨论】:

    • 很好,现在我明白为什么我的代码复制了标题行。 @jrs
    【解决方案4】:

    如果你有 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()
    

    【讨论】:

      猜你喜欢
      • 2018-12-23
      • 2014-05-02
      • 2018-05-15
      • 2016-11-16
      • 2023-03-15
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      相关资源
      最近更新 更多