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

2024-07-07 07:16:57 发布

您现在位置:Python中文网/ 问答频道 /正文

似乎已经有一些关于这个主题的东西了(How to replace all those Special Characters with white spaces in python?),但是我不能用我的一生来完成这个简单的任务。

我有一个.CSV文件,有75列,将近4000行。我需要将所有“特殊字符”($#&;*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行。此外,特殊的人物仍然存在!

很抱歉有多余的问题。 提前谢谢你!


Tags: 文件csvtextin主题closeinputoutput
3条回答

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

  1. writer.writerow()应该有一个字符串序列,每个字符串都用逗号分隔(参见here)。在你的例子中,你是在写一个字符串。
  2. 这段代码设置为通过inputlines两种方式从“C:/Temp/Data.csv”中读取,但它实际上只从input中读取(因此代码不将文件作为csv文件处理)。
  3. 代码将字符附加到newtext并写出该变量的每个版本。因此,newtext的第一个版本将是1个字符长,第二个是2个字符长,第三个是3个字符长,等等

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

这似乎不需要特别处理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")

我可以做些类似的事情

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)

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

相关问题 更多 >