ChatGPT解决这个技术问题 Extra ChatGPT

如何将文本文件读入字符串变量并去除换行符?

代码:

with open("data.txt", "r") as f:
    data = f.readlines()

输入文件:

ABC
DEF

但是,data 包含结尾的 \n

data == ['ABC\n', 'DEF']

如何得到:

data == 'ABCDEF'
标题和问题不一致。你真的想摆脱 \n 吗?
您是否真的想从文件/字符串内容中删除换行符,或者您只是对打印输出中的许多元字符感到困惑并且实际上想要保留换行符,但不让它们显示为“\n”?
您真的想将整个文本读入一个字符串变量吗?你真的是用“strip newlines”来用空字符串替换它们吗?这意味着,一行的最后一个单词和下一行的第一个单词是连接在一起的,而不是分开的。我不知道您的用例,但这似乎是一个奇怪的要求。如果您解释您打算如何处理读入数据,我可能会有另一个答案

O
OneCricketeer

你可以使用:

with open('data.txt', 'r') as file:
    data = file.read().replace('\n', '')

或者如果文件内容保证为一行

with open('data.txt', 'r') as file:
    data = file.read().rstrip()

只写 open("data.txt").read().replace('\n','') 有缺点吗?
是的,您的版本没有明确关闭文件,然后将延迟到垃圾收集器运行或程序终止。 'with' 语句通常封装一些设置/拆卸打开/关闭操作。
感谢您的澄清。因此,似乎我的版本对于小脚本来说可能没问题 - 但 OTOH 最好完全避免它,以免养成习惯。
@tuomassalo 它是测试/调试过程中的一个巨大的 PITA,因为如果您必须提前终止或遇到异常,它不会清理打开的文件句柄。
不,rstrip('\n') 只会从最后一行删除换行符,replace('\n','') 会在任何地方删除它(基本上使整个文件变成一行)
J
Jonathan Sudiaman

在 Python 3.5 或更高版本中,您可以使用 pathlib 将文本文件内容复制到变量中并在一行中关闭文件

from pathlib import Path
txt = Path('data.txt').read_text()

然后您可以使用 str.replace 删除换行符:

txt = txt.replace('\n', '')

这是迄今为止最优雅的解决方案。我更喜欢像 R 的 read_file 这样的单线解决方案
当我使用 pathlib 时,我收到此错误 UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 148: character maps to <undefined>。而且据我搜索,似乎我无法将编码设置为 pathlib,因此我必须使用 os 模块传统地读取内容。
@AliAkhtari 根据文档,签名是 read_text(encoding=None, errors=None)。你应该能够在那里传递编码?
m
mit

您可以在一行中读取文件:

str = open('very_Important.txt', 'r').read()

请注意,这不会显式关闭文件。

当文件作为垃圾回收的一部分退出时,CPython 将关闭文件。

但其他 python 实现不会。要编写可移植代码,最好使用 with 或显式关闭文件。短并不总是更好。请参阅https://stackoverflow.com/a/7396043/362951


这是反惯用的,不推荐。 open 应在 with ... as 语句中使用。
@JC 你能解释一下这个问题吗?这只是一个习惯问题还是 with ... as 声明带来了什么?
@Titou 的问题是 open.read() 不会关闭文件,所以我们需要 with ... asstr.close() ,如佩德罗的回答所示。更多关于关闭文件的重要性here
@JBallin。这个成语清楚地消除了错误的根源。谢谢 !
这也很糟糕,因为您刚刚从内置函数中隐藏了 str()
P
Pedro Lobito

要将所有行加入字符串并删除新行,我通常使用:

with open('t.txt') as f:
  s = " ".join([l.rstrip("\n") for l in f]) 

它在我的代码中给出了 UnicodeDecodeError 请参阅此stackoverflow.com/q/18649512/9339242
您可能需要指定字符编码。
也会删除尾随空格,因此可能更好s = " ".join([l.replace("\n", "") for l in f])
@gelonida rstrip 还支持指定要删除的章程,感谢您的提示。
也谢谢。我忘记了 rstrip() 也有一个论点。因此,您的代码可能更快且可操作,除了一些非常奇怪的情况,其中 one 行将包含尾随 " ""\n" 的混合,例如 "funny line \n \n "
M
MagerValp
with open("data.txt") as myfile:
    data="".join(line.rstrip() for line in myfile)

join() 将加入字符串列表,不带参数的 rstrip() 将从字符串末尾修剪空白,包括换行符。


L
Loochie

这可以使用 read() 方法完成:

text_as_string = open('Your_Text_File.txt', 'r').read()

或者因为默认模式本身是'r'(读取)所以简单地使用,

text_as_string = open('Your_Text_File.txt').read()

请注意,这会使文件无限期地打开。
g
gelonida

我很惊讶还没有人提到 splitlines()

with open ("data.txt", "r") as myfile:
    data = myfile.read().splitlines()

变量 data 现在是一个列表,打印时如下所示:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

请注意,没有换行符 (\n)。

那时,听起来您想将这些行打印回控制台,您可以使用 for 循环来实现:

for line in data:
    print(line)

g
gelonida

我已经摆弄了一段时间,并且更喜欢将 readrstrip 结合使用。如果没有 rstrip("\n"),Python 会在字符串末尾添加一个换行符,这在大多数情况下并不是很有用。

with open("myfile.txt") as f:
    file_content = f.read().rstrip("\n")
    print(file_content)

C
Chris Eberle

很难确切地说出你在追求什么,但这样的事情应该让你开始:

with open ("data.txt", "r") as myfile:
    data = ' '.join([line.replace('\n', '') for line in myfile.readlines()])

reduce(lambda x,y : x+y.rstrip('\n'), ['a\n', "b\n", 'c'], "") 更酷:D
@Duncan 你有什么建议?
data = ' '.join(line.replace('\n', '') for line in myfile) 或 MagerValp 的版本。
M
My Car

尝试这个:

with open("my_text_file.txt", "r") as file:
    data = file.read().replace("\n", "")

M
Michael Smith

你可以把它压缩成一成两行的代码!!!

content = open('filepath','r').read().replace('\n',' ')
print(content)

如果您的文件内容为:

hello how are you?
who are you?
blank blank

蟒蛇输出

hello how are you? who are you? blank blank

我喜欢这个解决方案,因为一行的最后一个单词将与下一行的第一个单词用空格隔开。但是我建议使用 with 语句。所以像with open("filepath", "r") as fin: content = fin.read().replace("\n", " ")这样的东西但是如果当然它不确定原始海报是否需要它
E
Edward D'Souza

这是一个单行的、可复制粘贴的解决方案,它也关闭了文件对象:

_ = open('data.txt', 'r'); data = _.read(); _.close()

O
OrionMD

您还可以剥离每一行并连接成最终字符串。

myfile = open("data.txt","r")
data = ""
lines = myfile.readlines()
for line in lines:
    data = data + line.strip();

这也可以解决问题。


data = data + line.strip(); 可以简化为 data += line.strip();
对于大文件来说效率非常低(会发生大量内存分配和内存副本。最好创建剥离行列表,然后使用“”.join()`
g
gerardw

python3:如果方括号语法对您来说是新的,请谷歌“列表理解”。

 with open('data.txt') as f:
     lines = [ line.strip('\n') for line in list(f) ]

非常pythonic,对我来说工作得很好,虽然我还没有测试过大文件。谢谢!
我将撤回我的赞成票,因为 strip 也会去除空格,这可能不是所需的行为。但是,我仍然认为修改版本会很好。
lines = list(map(str.strip, f))
M
Machinexa

单线:

列表:"".join([line.rstrip('\n') for line in open('file.txt')])

生成器:"".join((line.rstrip('\n') for line in open('file.txt')))

List 比生成器快,但在内存上更重。生成器比列表慢,并且对于内存(例如遍历行)更轻。在 "".join() 的情况下,我认为两者都应该工作得很好。应删除 .join() 函数以分别获取列表或生成器。

注意:可能不需要关闭()/关闭文件描述符


A
Ali

你试过这个吗?

x = "yourfilename.txt"
y = open(x, 'r').read()

print(y)

这是错误的。如果你打算这样做,你想要 y = open(x, 'r').read() 。
S
Sma Ma

要使用 Python 删除换行符,您可以使用字符串的 replace 函数。

此示例删除所有 3 种类型的换行符:

my_string = open('lala.json').read()
print(my_string)

my_string = my_string.replace("\r","").replace("\n","")
print(my_string)

示例文件是:

{
  "lala": "lulu",
  "foo": "bar"
}

您可以使用此重播场景进行尝试:

https://repl.it/repls/AnnualJointHardware

https://i.stack.imgur.com/cmmzY.png


g
gelonida
f = open('data.txt','r')
string = ""
while 1:
    line = f.readline()
    if not line:break
    string += line

f.close()


print(string)

应避免具有 string += line 的循环。某些版本的 Python 可能会设法避免此处的 O(n^2) 行为,但已给出的任何其他答案都比这更好。此外,您没有删除请求的换行符,因此您的代码只是一种非常缓慢的string = f.read()方式
谢谢你纠正我。但是一件小事是我不必删除新行,因为当我测试时,它没有打印出'\n'。 @邓肯
对于大文件非常低效。对于每次迭代,都必须分配内存并复制数据。另外:新行既没有被删除也没有被替换为“”尝试使用以下命令查看,新行仍然包含。 print(repr(string))
J
John Galbraith

我认为没有人解决您问题的 [ ] 部分。当您将每一行读入变量时,因为在将 \n 替换为 '' 之前有多行,您最终会创建一个列表。如果你有一个变量 x 并打印出来只是

X

或打印(x)

或 str(x)

您将看到带有括号的整个列表。如果您调用(排序数组)的每个元素

x[0] 然后省略括号。如果您使用 str() 函数,您将只看到数据而不是 '' 。 str(x[0])


佚名

也许你可以试试这个?我在我的程序中使用它。

Data= open ('data.txt', 'r')
data = Data.readlines()
for i in range(len(data)):
    data[i] = data[i].strip()+ ' '
data = ''.join(data).strip()

A
Alex

正则表达式也可以:

import re
with open("depression.txt") as f:
     l = re.split(' ', re.sub('\n',' ', f.read()))[:-1]

print (l)

['我','感觉','空','和','死','里面']


R
Roksolanka Fedkovych
with open('data.txt', 'r') as file:
    data = [line.strip('\n') for line in file.readlines()]
    data = ''.join(data)

P
PyGuy

这有效:将您的文件更改为:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

然后:

file = open("file.txt")
line = file.read()
words = line.split()

这将创建一个名为 words 的列表,它等于:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

这摆脱了“\ n”。要回答有关括号妨碍您的部分,只需执行以下操作:

for word in words: # Assuming words is the list above
    print word # Prints each word in file on a different line

或者:

print words[0] + ",", words[1] # Note that the "+" symbol indicates no spaces
#The comma not in parentheses indicates a space

这将返回:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN, GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

更改文件可能在一次性情况下有效,但如果您有数百个文件,这不是一个可行的解决方案。
L
Lakshaya Maheshwari
with open(player_name, 'r') as myfile:
 data=myfile.readline()
 list=data.split(" ")
 word=list[0]

此代码将帮助您阅读第一行,然后使用列表和拆分选项,您可以将由空格分隔的第一行单词转换为存储在列表中。

您可以轻松访问任何单词,甚至将其存储在字符串中。

你也可以使用 for 循环来做同样的事情。


a
akD
file = open("myfile.txt", "r")
lines = file.readlines()
str = ''                                     #string declaration

for i in range(len(lines)):
    str += lines[i].rstrip('\n') + ' '

print str

y
yota
line_lst = Path("to/the/file.txt").read_text().splitlines()

是获取文件所有行的最佳方法,'\n' 已经被 splitlines() 剥离(它可以智能地识别 win/mac/unix 行类型)。

但是,如果您仍然想剥离每一行:

line_lst = [line.strip() for line in txt = Path("to/the/file.txt").read_text().splitlines()]

strip() 只是一个有用的示例,但您可以随意处理您的线路。

最后,您只想要连接文本吗?

txt = ''.join(Path("to/the/file.txt").read_text().splitlines())

P
Palak Jain

尝试以下操作:

with open('data.txt', 'r') as myfile:
    data = myfile.read()

    sentences = data.split('\\n')
    for sentence in sentences:
        print(sentence)

注意:它不会删除 \n。仅用于查看文本,就好像没有 \n