函数无法更新逗号后的间距

Function failing to update spacing after comma

我有一个 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 系统查看了问题 here, but I cannot use that method as I need the delimiter to be ", ", which is two characters and hence not allowed. I also tried to follow the method in the sed answer to the question here 的答案,但也失败了,我不太了解 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 模块读取行,并且对于每一行,您将 strip() 元素。

更新: 正则表达式可以简化为

regex = r"\s*,\s*"

原始代码有几个错误:

  • if "," in data 条件永远不会计算为真。 data 是一个列表,列表中的每一项都是代表文件整行的字符串。文件中没有一行是 ,,因此该条件永远不会计算为真。要修复它,请使用 if "," in item。这样它就会检查每一行是否有逗号。
  • 还有第二个问题:item.index 函数 returns 只是逗号的第一个实例,因此如果两次出现不一致的间距,算法将无法捕捉到它。

不需要正则表达式或 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(",", ", ")) 首先从行中完全删除所有 space(感谢@megakarg 的建议),然后确保每个逗号后有一个 space 满足规格