繁体   English   中英

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

[英]Remove special characters from csv file using python

在这个主题上似乎已经有了一些东西( 如何用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行。 此外,特殊字符仍然存在!

很抱歉这个多余的问题。 先感谢您!

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

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

除了@ Nisan.H指出的bug和@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文件。

也许试试吧

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM