我有一个csv文件,逗号后面的空格不一致,如下所示:
534323, 93495443,34234234, 3523423423, 2342342,236555, 6564354344
我写了一个函数,试图在文件中读取并使间距一致,但它似乎没有更新任何东西。打开新创建的文件后,与原来的文件没有区别。我写的函数是:
def ensure_consistent_spacing_in_csv(dirpath, original_name, new_name):
with open(dirpath + original_name, "r") as f:
data = f.readlines()
for item in data:
if "," in data:
comma_index = item.index(",")
if item[comma_index + 1] != " ":
item = item.replace(",", ", ")
with open(dirpath + new_name, "w") as f:
f.writelines(data)
我哪里错了?
我已经查看了这里问题的答案,但是我不能使用该方法,因为我需要分隔符为", ",这是两个字符,因此是不允许的。我还尝试使用process.call
系统遵循sed
回答问题的方法,但这也失败了,我不太了解bash,所以我犹豫要不要走那条路,想使用纯python方法。
谢谢!
我是如何从你的例子
规范化字符串的间距注意:我假设文件的内容不够大,不足以超过可用内存,因为您在代码中将其读入列表。
注意:使用正则表达式可能并不总是(读几乎从来)是解决问题的最有效的方法,但它可以完成工作。
regex = r"(?<=d)s*,s*(?=d)" # please see the UPD:
test_str = "534323, 93495443,34234234, 3523423423, 2342342,236555, 6564354344"
subst = ", "
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)
print(result)
将产生
534323, 93495443, 34234234, 3523423423, 2342342, 236555, 6564354344
和具有以下上下文的文件:
1, 2, 3, 4,5,6
1,2,3,4, 5, 6
1, 2,3,4,5,6
我跑
with open('test.csv') as f:
data = f.read()
regex = r"(?<=d)s*,s*(?=d)" # please see the UPD:
subst = ", "
result = re.sub(regex, subst, data)
print(result)
,得到如下结果:
1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6
或者您可以使用CSV模块读取行,并且对于每一行,您将剥离()元素。
乌利希期刊指南:正则表达式可以简化为
regex = r"s*,s*"
原始代码有几个错误:
if "," in data
条件的计算结果永远不会为真。data
是一个列表,其中列表中的每个项都是一个字符串,代表文件的一整行。文件中没有任何一行是,
,因此该条件的计算结果永远不会为true。要修复它,请使用if "," in item
。这样它就会检查每行是否有逗号。- 还有第二个问题:
item.index
函数只返回逗号的第一个实例,所以如果在一个中有两次不一致的空格,算法不会捕获它。
不需要正则表达式或sed
或索引和逐个字符查看每个单词的简单解决方案是:
with open(dirpath + orig_filename, "r") as f:
for line in f:
new_line = line.replace(" ", "").replace(",", ", ")
with open(dirpath + cleaned_filename, "a") as cleaned_data:
cleaned_data.writelines(new_line)
它的作用是:
for line in f
读取文件的每一行。line.replace(" ", "").replace(",", ", "))
首先从行中完全删除所有空格(感谢@megakarg的建议),然后确保每个逗号后面有一个空格以满足规格。