Python 将文件读入二维列表 - newline=None vs strip("\r\n")

Python reading file into 2d list - newline=None vs strip("\r\n")

编辑:bigbounty 要求提供示例数据。我不确定在此处粘贴时如何保留换行符,因此我提供了一张图片。见下文。

我正在尝试确定在将数据从永恒文件读取到二维列表时去除换行符的正确且最符合 Pythonic 的方法。我无法弄清楚 newlineopen() 中做了什么(是的,我已经检查了文档 - 它仍然没有为我点击)。下面的代码是将数据读入 2d 列表的正确方法,避免捕获换行符吗?它的任何部分是否多余(例如newline=None?)

编辑:我在 windows,但正在寻找跨平台解决方案。

with open(file_name, "r", newline=None) as fh:
    list_2d = [[char for char in line.strip("\r\n")] for line in fh]

只是不要将 \n 字符放入列表中。

with open('a.txt', "r") as fh:
    list_2d = [[char for char in line if char!='\n'] for line in fh]

如果你想兼容所有平台,可以打开w.r.t。 'rU' 模式以 Universal newline mode and then every newline occurrence will appear as a '\n' character (so then you only need to count '\n' chars). Since Python 3, it is deprecated 打开文件,'rU' 模式等于 newline=None,这意味着代码片段是跨平台的。

list_2d = []
with open(file_name, newline=None) as fh:
     list_2d.append([x for x in line.split("\n")])

如果您只想阅读,则无需使用 'r' 说明符,因为它已经是默认参数。

如果您不介意一次将整个文件读入内存(看起来您不介意这样做,因为您正在使用整个文件并将其塞入列表),您可以使用 lines = file.read().splitlines(),这将是一个字符串列表,其中每个字符串是一行(没有尾随回车 return 或换行符)。

不用提了

  1. 只读模式,这是默认设置。
  2. newLine = None,这是默认值。
with open(file_name) as fh:
    list_2d = [[char for char in line if char != "\n"] for line in fh]

opennewline 参数启用 universal newline mode 如果它是 None''。两者之间的区别在于 None 还会在读取文件时将换行符转换为 \n(如果写入文件,则将其转换回),而 '' 不会执行这个翻译。

因此,如果您将 opennewline=None 一起使用,您可以期望以文件结尾的任何行都将作为 \n 返回给您,无论您使用的是哪个平台。

由于 newline=None 是默认设置(类似地,文本模式的读取是默认设置),您的示例可以针对任何平台编写为:

with open(file_name) as fh:
    list_2d = [[char for char in line.strip("\n")] for line in fh]