【问题标题】:End-line characters from lines read from text file, using Python使用 Python 从文本文件中读取的行中的结束行字符
【发布时间】:2010-09-25 06:27:27
【问题描述】:

使用 python 从文本文件中读取行时,通常需要在处理文本之前截断行尾字符,如下例所示:

f = open("myFile.txt", "r")
for line in f:
    line = line[:-1]
    # do something with line

有没有一种优雅的方式或习语来检索没有结束行字符的文本行?

【问题讨论】:

标签: python


【解决方案1】:

在 Python 中执行此操作的惯用方法是使用 rstrip('\n')

for line in open('myfile.txt'):  # opened in text-mode; all EOLs are converted to '\n'
    line = line.rstrip('\n')
    process(line)

其他每一个选择都有一个陷阱:

  • file('...').read().splitlines() 必须一次将整个文件加载到内存中。
  • 如果最后一行没有 EOL,line = line[:-1] 将失败。

【讨论】:

  • HTTP 和其他协议指定 '\r\n' 作为行尾,因此您应该使用 line.rstrip('\r\n') 来保证健壮性。
  • 感谢您的帮助!我需要打开一个文本文件,我很惊讶地看到 \n - 甚至在 Python 中就像在 Perl、C 和许多其他语言中一样。我会把它收藏起来,永远不会忘记它。
【解决方案2】:

简单。使用 splitlines()

L = open("myFile.txt", "r").read().splitlines();
for line in L: 
    process(line) # this 'line' will not have '\n' character at the end

【讨论】:

  • 但请注意,这会首先将整个文件加载到内存中,这可能会使其不适合某些情况。
【解决方案3】:

您的代码有什么问题?我觉得它非常优雅和简单。唯一的问题是,如果文件没有以换行符结尾,则返回的最后一行不会有'\n' 作为最后一个字符,因此执行line = line[:-1] 会错误地删除该行的最后一个字符。

解决这个问题的最优雅的方法是定义一个生成器,它获取文件的行并从每行中删除最后一个字符,前提是该字符是换行符:

def strip_trailing_newlines(file):
    for line in file:
        if line[-1] == '\n':
            yield line[:-1]
        else:
            yield line

f = open("myFile.txt", "r")
for line in strip_trailing_newlines(f):
    # do something with line

【讨论】:

  • Mac 文件使用'\r',windows 使用'\r\n',它开始变粗。更好地使用 str.rstrip()
  • 如果文件以文本模式打开,平台的本地行尾在读入时会自动转换为单个 '\n'。而且只有 非常老 Mac操作系统使用普通的 '\r'。如果要保留尾随空格和制表符,则不能使用 rstrip()。
  • 好主意,使用生成器。在可重用的库中会很方便。我会将您的解决方案与 efonitis 的解决方案结合起来(以保存 if:else:)。如果手头没有可重用的库,我更喜欢 efotinis 的解决方案(使用 line.rstrip('\n'))。
  • +1;这就是我使用的。您能否将您的if/else 替换为rstrip('\n')
【解决方案4】:

很久以前,有可以在 16 kb 核心机器上运行的亲爱的、干净的、旧的 BASIC 代码: 像这样:

if (not open(1,"file.txt")) error "Could not open 'file.txt' for reading"
while(not eof(1)) 
  line input #1 a$
  print a$
wend
close

现在,要使用更好的硬件和软件 (Python) 逐行读取文件,我们必须重新发明轮子:

def line_input (file):
    for line in file:
        if line[-1] == '\n':
            yield line[:-1]
        else:
            yield line

f = open("myFile.txt", "r")
for line_input(f):
    # do something with line

我被诱导认为某些地方出了问题......

【讨论】:

  • 虽然,考虑到 python 是我们入门级解释语言的最佳选择,我同意这个评论,但注意到带有 WHILE 语句的 16kb BASIC 并不常见。
【解决方案5】:

您对这种方法有什么看法?

with open(filename) as data:
    datalines = (line.rstrip('\r\n') for line in data)
    for line in datalines:
        ...do something awesome...

生成器表达式避免将整个文件加载到内存中,with 确保关闭文件

【讨论】:

    【解决方案6】:

    您也可以考虑使用 line.rstrip() 删除行尾的空格。

    【讨论】:

    • 我也使用 rstrip(),但你要记住它也会去掉尾随空格和制表符
    • 正如 efotinis 所示,如果您指定 chars 参数,您可以指定要剥离的内容。来自文档:"""rstrip([chars]) chars 参数是一个字符串,指定要删除的字符集。如果省略或 None,chars 参数默认删除空格。"""
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多