【问题标题】:Replace newlines with a space in all files in a directory - Python用目录中所有文件中的空格替换换行符 - Python
【发布时间】:2018-07-04 22:45:06
【问题描述】:

我在一个目录中有大约 4000 个 txt 文件。我想使用 for 循环在每个文件中用空格替换换行符。实际上,该脚本适用于该目的,但是当我保存文件时,它不会被保存或再次用换行符保存。这是我的脚本;

import glob
path = "path_to_files/*.txt"
for file in glob.glob(path):
    with open(file, "r+") as f:
        data = f.read().replace('\n', ' ')
        f.write(data)

正如我所说,我可以用空格替换换行符,但最后它没有被保存。我也没有收到任何错误。

【问题讨论】:

  • 在 'r+' 模式下打开文件几乎总是一个坏主意(因为当前位置的处理方式)。打开一个文件读取,读取数据,替换换行符,打开同一个文件文件写入,写入数据。
  • 如果没有f.seek(),我认为它不会像您所说的那样工作。

标签: python text file-io


【解决方案1】:

进一步详细说明我的评论(“以 'r+' 模式打开文件几乎总是一个坏主意(因为当前位置的处理方式)。打开文件进行读取,读取数据, 替换换行符,打开同一个文件文件进行写入,写入数据"):

for file in glob.glob(path):
    with open(file) as f:
        data = f.read().replace('\n', ' ')
    with open(file, "w") as f:
        f.write(data)

【讨论】:

  • 成功了,也感谢您指出“r+”模式。但是,当我单独打开文件以保存文件时,循环需要更长的时间才能完成。你认为这种权衡值得吗?
  • 如果是一次性交易,我更喜欢结构清晰的循环。你决定。
  • 我知道了。它似乎也更优雅。我在脚本中就是这样使用的。
【解决方案2】:

您需要使用seek 将文件位置重置为0,然后在写完替换字符串后使用truncate 截断剩余部分。

import glob
path = "path_to_files/*.txt"
for file in glob.glob(path):
    with open(file, "r+") as f:
        data = f.read().replace('\n', ' ')
        f.seek(0)
        f.write(data)
        f.truncate()

【讨论】:

  • truncate 是做什么的?
  • 它在当前位置截断文件,除非指定位置。见:tutorialspoint.com/python3/file_truncate.htm
  • 如果新旧文件的大小完全相同,为什么还需要truncate
  • 这也适用于上面的答案,但是您认为重置位置是一种更安全的方式吗?
  • @DyZ 在这种情况下不需要truncate 是绝对正确的,但一般来说,如果您不确定替换的大小与原始的大小相比,您希望截断提前。我只是把它放在那里,以便解决方案更通用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2018-04-19
  • 2012-01-31
  • 2018-11-23
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多