re.sub用于csv文件

时间:2015-06-23 17:24:44

标签: python regex

我收到有关此代码的错误。它是“TypeError:期望的字符串或缓冲区”。我环顾四周,发现错误是因为我传递了re.sub一个列表,而且它没有列表。但是,我无法弄清楚如何将我的行从csv文件更改为它将读取的内容。

我正在尝试将csv文件中的所有句点更改为逗号。这是我的代码:

select
  t.ID
from
  YourTable t
  left join ValueTable v on v.ID = t.ID
group by
  t.ID
order by
  min(v.Value)

如果已经在某个地方回答过,我很抱歉。关于这个错误肯定有很多答案,但我无法使用我的csv文件。另外,作为旁注,这最初是一个.xslb excel文件,我转换为csv以便能够使用它。那有必要吗?

3 个答案:

答案 0 :(得分:2)

您可以使用列表理解将替换应用于row

中的每个项目
for row in reader:   
    newrow = [re.sub(r"(\.)+", ",", item) for item in row]
    writer.writerow(newrow)

答案 1 :(得分:0)

for row in reader不会返回单个元素来解析它,而是返回row中元素的列表,因此您必须解压该列表并分别解析每个项目,就像@Trii一样:

[re.sub(r'(\.)+','.',s) for s in row]

答案 2 :(得分:0)

在本例中,我们使用 glob 访问目录中的所有 csv 文件。 下面的代码会覆盖源 csv 文件,因此无需创建输出文件。

注意:

如果您想使用 re.sub 提供的参数获取第二个文件,请将 write = open(i, 'w') 替换为 write = open('secondFile.csv', 'w')

import re
import glob

for i in glob.glob("*.csv"):
    read = open(i, 'r')
    reader = read.read()
    csvRe = re.sub(re.sub(r"(\.)+", ",", str(reader))
    write = open(i, 'w')
    write.write(csvRe)
    read.close()
    write.close()