函数无法更新逗号后的空格



我有一个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)

它的作用是:

  1. for line in f读取文件的每一行。
  2. line.replace(" ", "").replace(",", ", "))首先从行中完全删除所有空格(感谢@megakarg的建议),然后确保每个逗号后面有一个空格以满足规格。

相关内容

  • 没有找到相关文章

最新更新