6

这个话题似乎已经有了一些东西(如何在 python 中用空格替换所有这些特殊字符?),但我无法为我的生活解决这个简单的任务。

我有一个包含 75 列和近 4000 行的 .CSV 文件。我需要用“_”替换所有“特殊字符”($ # & * 等)并写入一个新文件。这是我到目前为止所拥有的:

import csv

input = open('C:/Temp/Data.csv', 'rb')
lines = csv.reader(input)
output = open('C:/Temp/Data_out1.csv', 'wb')
writer = csv.writer(output)

conversion = '-"/.$'
text =  input.read()
newtext = '_'
for c in text:
    newtext += '_' if c in conversion else c
    writer.writerow(c)

input.close()
output.close()

所有这一切都成功地将所有内容作为单列写入输出文件,产生超过 65K 行。此外,特殊字符仍然存在!

对不起,多余的问题。先感谢您!

4

4 回答 4

4

这似乎不需要特别处理 CSV(只要特殊字符不是您的列分隔符)。

lines = []
with open('C:/Temp/Data.csv', 'r') as input:
    lines = input.readlines()

conversion = '-"/.$'
newtext = '_'
outputLines = []
for line in lines:
    temp = line[:]
    for c in conversion:
        temp = temp.replace(c, newtext)
    outputLines.append(temp)

with open('C:/Temp/Data_out1.csv', 'w') as output:
    for line in outputLines:
        output.write(line + "\n")
于 2013-04-01T20:13:21.593 回答
4

我可能会做类似的事情

import csv

with open("special.csv", "rb") as infile, open("repaired.csv", "wb") as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile)
    conversion = set('_"/.$')
    for row in reader:
        newrow = [''.join('_' if c in conversion else c for c in entry) for entry in row]
        writer.writerow(newrow)

哪个转

$ cat special.csv
th$s,2.3/,will-be
fixed.,even.though,maybe
some,"shoul""dn't",be

(请注意,我有一个引用的值)到

$ cat repaired.csv 
th_s,2_3_,will-be
fixed_,even_though,maybe
some,shoul_dn't,be

现在,您的代码正在将整个文本读入一大行:

text =  input.read()

从一个_字符开始:

newtext = '_'

循环遍历每个字符text

for c in text:

将更正的字符添加到newtext(非常缓慢):

    newtext += '_' if c in conversion else c

然后将原始字符 (?) 作为一列写入新的 csv:

    writer.writerow(c)

..这不太可能是你想要的。:^)

于 2013-04-01T20:20:18.737 回答
0

除了@Nisan.H 指出的错误和@dckrooney 提出的有效观点之外,在这种情况下您可能不需要以特殊方式处理文件,因为它是一个 CSV 文件(但请参阅下面的我的评论) :

  1. writer.writerow()应该采用一系列字符串,每个字符串都用逗号分隔(请参见此处)。在您的情况下,您正在编写一个字符串。
  2. 此代码设置为以两种方式从“C:/Temp/Data.csv”读取 - 直通input和直通,lines但它仅实际读取input(因此代码不会将文件作为 CSV 文件处理)。
  3. 该代码将字符附加到newtext并写出该变量的每个版本。因此,第一个版本的newtext长度为 1 个字符,第二个版本的长度为 2 个字符,第三个版本的长度为 3 个字符,以此类推。

最后,鉴于 CSV 文件中可以包含引号,实际上可能需要将输入文件专门作为 CSV 处理,以避免替换您要保留的引号,例如用于保护逗号的引号存在于 CSV 文件的字段中。在这种情况下,需要单独处理 CSV 文件的每个字段,然后将每一行写入新的 CSV 文件。

于 2013-04-01T20:27:34.983 回答
0

也许试试

s = open('myfile.cv','r').read()

chars = ('$','%','^','*') # etc
for c in chars:
  s = '_'.join( s.split(c) )

out_file = open('myfile_new.cv','w')
out_file.write(s)
out_file.close()
于 2013-04-01T22:34:41.300 回答