使用Python从文本文件中读取行的行尾字符

pyt*_*ick 30 python

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

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

是否有一种优雅的方式或习惯用于检索没有终结字符的文本行?

efo*_*nis 47

在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)
Run Code Online (Sandbox Code Playgroud)

每个其他替代方案都有一个问题:

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

  • HTTP和其他协议为行结尾指定'\ r \n',因此您应该使用line.rstrip('\ r \n')来获得健壮性. (15认同)

Vij*_*Dev 17

简单.使用splitlines()

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

  • 但请注意,这会先将整个文件加载到内存中,这可能会使其不适合某些情况. (5认同)

Ada*_*eld 6

您的代码有什么问题?我发现它非常优雅和简单.唯一的问题是,如果文件没有以换行符结尾,则返回的最后一行将不会有'\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
Run Code Online (Sandbox Code Playgroud)

  • Mac文件使用'\ r',windows使用'\ r \n',它开始变得粗糙.使用str.rstrip()好多了 (3认同)
  • 如果文件以文本模式打开,平台的本机行结尾会在读入时自动转换为单个'\n'.只有_lally old_ Mac OS使用普通的'\ r'.如果要保留尾随空格和制表符,则不能使用rstrip(). (3认同)

小智 5

很久以前,有可以在 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
Run Code Online (Sandbox Code Playgroud)

现在,要使用更好的硬件和软件 (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
Run Code Online (Sandbox Code Playgroud)

我被诱导认为某事在某处出错了......

  • 虽然考虑到 Python 是我们入门级解释性语言的最佳选择,但我同意这个评论,注意到 16kb BASIC 和 WHILE 语句从不常见是很方便的。 (2认同)