【问题标题】:readlines() python 2.7 vs 3.10readlines() python 2.7 与 3.10
【发布时间】:2022-01-21 23:10:11
【问题描述】:

我在 python 2.7 中编写了一个脚本,但想切换到 python 3.10 唯一的问题是由于某种原因 readlines() 命令没有产生相同的结果并且导致我的列表组合出现问题。以下是两个不同的版本及其结果:


Python 2.7

file_to_open = open('file.csv', 'r') 
f = file_to_open.readlines()
print(len(f))

结果是 2001


Python 3.10

file_to_open = open('file.csv', 'r') 
f = file_to_open.readlines()
print(len(f))

结果是 10401


csv 文件确实有 2001 行,所以这是正确的数字。必须有一些字符正在创建新行或与 python 3 版本搞砸的东西。有没有人遇到过这种情况?

【问题讨论】:

  • 你能发一份文件样本吗?
  • 这可能是一个通用的换行符。尝试在 Python 2 中以'rU' 模式打开文件,看看是否得到 10401。如果这样做,差异是由通用换行符引起的。不过,如果是这样的话,那将是一个非常奇怪的 CSV 文件。
  • len 在这里没有提供足够的信息。 f[:10] 给了什么?当这两个结果不同时,这是一种更好的探测方式。
  • 很遗憾,我无法发布文件,因为它与工作有关。 @user2357112supportsMonica 它确实与 csv 中的 \n 字符有关。查看 csv 中的所有字段,其中有几个字段包含 \n 字符。你是对的。但是如何让 python 3 忽略这些,只做行尾?

标签: python python-3.x python-2.7 list-comprehension readlines


【解决方案1】:

这与通用新行以及 python 2 和 3 如何读取它们有关。在 CSV 文件中,字段中有额外的“\r”字符。所以我不得不在打开文件时使用'b'选项来忽略通用的新行。但后来它以字节形式读取每一行,所以我必须将每一行类型转换回 str,然后执行 re.sub 来替换 '\r' 字符。下面是我创建的列表,最终效果很好。

重新导入

f = [re.sub(' \r ', '', str(line)) for line in open('file.csv', 'rb')]

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 2018-01-19
    • 2016-04-27
    • 2022-07-19
    • 1970-01-01
    • 2015-02-24
    • 2018-05-18
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多