使用python从csv文件中删除特殊字符

时间:2013-04-01 19:48:41

标签: python csv python-2.7

这个话题似乎已经存在(How to replace all those Special Characters with white spaces in python?),但我不能为我的生活找出这个简单的任务。

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

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 个答案:

答案 0 :(得分: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")

答案 1 :(得分: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)

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

答案 2 :(得分:0)

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

  1. writer.writerow()应该采用一系列字符串,每个字符串都用逗号分隔(参见here)。在你的情况下,你正在写一个字符串。
  2. 此代码设置为以两种方式从'C:/Temp/Data.csv'读取 - 通过inputlines但它实际上只读取来自input(因此代码不会将文件作为CSV文件处理)。
  3. 代码将字符附加到newtext并写出该变量的每个版本。因此,newtext的第一个版本将是1个字符长,第二个版本是2个字符长,第3个字符长,等等。
  4. 最后,鉴于CSV文件可以中包含引号,实际上可能需要将输入文件专门作为CSV处理,以避免替换您要保留的引号,例如引号用于保护CSV文件字段中存在的逗号。在这种情况下,需要单独处理CSV文件的每个字段,然后将每一行写入新的CSV文件。

答案 3 :(得分: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()