[英]how do I remove commas within columns from data retrieved from a CSV file
我有几个 CSV 文件需要处理。 在每个列中,字段中可能有逗号。 字符串也可能位于双引号内。 我想出一些东西是正确的,但我正在处理有时在 200 - 400 MB 之间的 CSV 文件。 用我当前的代码处理它们可以让一个 11MB 的文件需要 4 分钟来处理。
我可以在这里做些什么来让它运行得更快,或者一次处理整个数据而不是逐个字段地运行代码?
import csv
def rem_lrspaces(data):
data = data.lstrip()
data = data.rstrip()
data = data.strip()
return data
def strip_bs(data):
data = data.replace(",", " ")
return data
def rem_comma(tmp1,tmp2):
with open(tmp2, "w") as f:
f.write("")
f.close()
file=open(tmp1, "r")
reader = csv.reader(file,quotechar='"', delimiter=',',quoting=csv.QUOTE_ALL, skipinitialspace=True)
for line in reader:
for field in line:
if "," in field :
field=rem_lrspaces(strip_bs(field))
with open(tmp2, "a") as myfile:
myfile.write(field+",")
with open(tmp2, "a") as myfile:
myfile.write("\n")
pdfsource=r"C:\automation\cutoff\test2"
csvsource=pdfsource
ofn = "T3296N17"
file_in = r"C:\automation\cutoff\test2"+chr(92)+ofn+".CSV"
file_out = r"C:\automation\cutoff\test2"+chr(92)+ofn+".TSV"
rem_comma(file_in,file_out)
一些低垂的果实:
strip_bs
太简单了,无法证明调用该函数的开销是合理的。rem_lrspaces
冗余地剥离空白; 您只需要一次调用data.strip()
,在这种情况下,证明单独的函数也太简单了。 此外,最好将已经打开的文件句柄传递给rem_comma
,因为它允许将内存中的类文件对象作为参数传递,从而使测试更容易。
此代码只是从每一行构建一个新的字段列表,然后使用csv.writer
将新字段写回输出文件。
import csv
def rem_comma(f_in, f_out):
reader = csv.reader(f_in, quotechar='"', delimiter=',', quoting=csv.QUOTE_ALL, skipinitialspace=True)
writer = csv.writer(f_out)
for line in reader:
new_line = [field.replace(",", " ").strip() for field in line]
writer.write_row(new_line)
ofn = "T3296N17"
file_in = r"C:\automation\cutoff\test2"+chr(92)+ofn+".CSV"
file_out = r"C:\automation\cutoff\test2"+chr(92)+ofn+".TSV"
with open(file_in) as f1, open(file_out) as f2:
rem_comma(f1, f2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.