【问题标题】:Error while editing many CSV files编辑多个 CSV 文件时出错
【发布时间】:2013-08-22 16:15:13
【问题描述】:

几天前我问了这个问题,因为我在编辑一些 CSV 文件时需要帮助:Fix numbering on CSV files that have deleted lines。 Stack Overflow 的人帮了我很多忙,但是我一直收到错误消息 AttributeError: 'int' object has no attribute 'strip'. 问题是我的 CSV 文件中的所有信息都不是整数。作为我的 python 新手,尝试修复它几天只会让事情变得更糟。这是我之前的问题中给出的错误信息:

import csv
import glob
import os 
import re 

numbered = re.compile(r'N\d+').match

for fn in fns:
     # open for counting
     reader = csv.reader(open(fn,"rb"))
     count = sum(1 for row in reader if row and not any(r.strip() == 'DIF' for r in     row) and numbered(row[0]))

 # reopen for filtering
 reader = csv.reader(open(fn,"rb"))

 with open (os.path.join('out', fn), 'wb') as f:
    counter = 0
    w = csv.writer(f)
    for row in reader:
        if row and 'Count' in row[0].strip():
            row = ['Count', count]
        if row and not any(r.strip() == 'DIF' for r in row): #remove DIF
            if numbered(row[0]):
                counter += 1
                row[0] = 'N%d' % counter
        w.writerow(row)

该代码本质上应该运行一堆 CSV 文件并删除其中包含“DIF”的所有行,并修复因删除行而导致的编号。有人有什么建议吗?

【问题讨论】:

  • 你有没有尝试过我的方法?我认为的问题是,如果您将其作为字符串读入,那么您所做的比您需要做的更多,那么它必须是一个字符串,然后您不必担心数据的性质。将 csv 添加到混合中会增加可能不需要的复杂性

标签: python csv counter glob


【解决方案1】:

最简单的可能是将 r 包装在 str() 中。但同时,你为什么不只读取一次文件,让它更容易:

import csv
import glob
import os
import re

numbered = re.compile(r'N\d+').match

for fn in fns:
     reader = csv.reader(open(fn,"rb"))

     # filter out 'DIF' rows here
     rows = [ row for row in reader 
              if not any(str(r).strip() == 'DIF' 
                   for r in row) ]

     # count numbered rows
     count = len([row for row in rows if row and numbered(row[0])])

     with open (os.path.join('out', fn), 'wb') as f:
        counter = 0
        w = csv.writer(f)

        for row in rows:
            if row and 'Count' in row[0].strip():
                row = ['Count', count]

            if row and numbered(row[0]):
                counter += 1
                row[0] = 'N%d' % counter

            w.writerow(row)

【讨论】:

  • 我收到一条错误消息,提示“生成器”类型的对象没有 len。这是什么意思?
  • 抱歉,已修复 - 无法使用生成器表达式的 len()
  • 代码有效,但我的 CSV 没有变化。你有什么想法吗?
  • 您的代码不会更改 csv,它会将更改后的文件写入 out/ 文件夹
  • 输出文件夹中的文件没有改变。在我正在测试的示例中,有六个带有DIF 的单元格。还有什么可能吗?
猜你喜欢
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
相关资源
最近更新 更多