我刚开始学习python并且有一个看起来像这样的文本文件:
Hello
World
Hello
World
我想将数字'55'添加到以'hello'开头的每个字符串的开头和结尾
开头的数字'66'以及以'World'开头的每个字符串
等
所以我的最终文件应如下所示:
55Hello55
66World66
55Hello55
66World66
我正在一次读取所有文件,将其存储在一个字符串中,然后尝试相应地附加
fp = open("test.txt","r")
strHolder = fp.read()
print(strHolder)
if 'Hello' in strHolder:
strHolder = '55' + strHolder + '55'
if 'World' in strHolder:
strHolder = '66' + strHolder + '66'
print(strHolder)
fp.close()
但是,我的字符串值'55'和'66'总是被添加到文件的前面和文件的末尾,而不是某个字符串的前面和字符串的末尾,我得到这个输出字符串:
6655Hello
World
Hello
World
5566
非常感谢任何帮助。
答案 0 :(得分:2)
您正在使用.read()
一次阅读整个文件。
您可以在for
循环中逐行阅读。
new_file = []
fp = open("test.txt", "r")
for line in fp:
line = line.rstrip("\n") # The string ends in a newline
# str.rstrip("\n") removes newlines at the end
if "Hello" in line:
line = "55" + line + "55"
if "World" in line:
line = "66" + line + "66"
new_file.append(line)
fp.close()
new_file = "\n".join(new_file)
print(new_file)
你可以通过读取整个文件并按" \ n"分开来一次完成所有操作。 (换行)
new_file = []
fp = open("text.txt")
fp_read = fp.read()
fp.close()
for line in fp_read.split("\n"):
if "Hello" # ...
但是这会将整个文件一次加载到内存中,而for循环只会逐行加载(所以这可能不适用于较大的文件)。
这样做的行为是,如果该行有" Hello"在其中,它将得到" 55"它之前和之后(即使该线是" sieohfoiHellosdf")和#34; World"相同,如果它同时具有" Hello"和"世界" (例如"你好,世界!"或者#34; asdifhoasdfhHellosdjfhsodWorldosadh")它将得到" 6655"之前和之后。
正如旁注:您应该使用with
打开文件,因为它确保文件稍后关闭。
new_file = []
with open("test.txt") as fp: # "r" mode is default
for line in fp:
line = line.rstrip("\n")
if "Hello" in line:
line = "55" + line + "55"
if "World" in line:
line = "66" + line + "66"
new_file.append(line)
new_file = "\n".join(new_file)
print(new_file)
答案 1 :(得分:0)
您需要迭代文件的每一行以获得所需的结果。在您的代码中,您使用的是.read()
,而是使用.readlines()
获取所有行的列表。
以下是示例代码:
lines = []
with open("test.txt", "r") as f:
for line in f.readlines(): # < Iterate over each line
if line.startswith("Hello"): # <-- check if line starts with "Hello"
line = "55{}55".format(line)
elif line.startswith("World"):
line = "66{}66".format(line)
lines.append(line)
print "\n".join(lines)
为什么要使用with
?检查Python doc:
'with'语句澄清了之前使用try ... finally块的代码,以确保执行清理代码。在本节中,我将讨论通常会使用的语句。在下一节中,我将检查实现细节,并展示如何编写用于此语句的对象。
'with'语句是一个控制流结构,其基本结构为:
表达式[作为变量]:with-block
评估表达式,它应该产生一个支持上下文管理协议的对象(即输入()和退出()方法)。
答案 2 :(得分:0)
一旦你读完了文件:
read_file = read_file.replace('hello','55hello55')
它将用55hello55取代所有的hellos
并使用with open(text.txt, 'r' ) as file_hndler:
答案 3 :(得分:0)
要阅读文本文件,我建议使用以下与Python 2兼容的方法。 3:
import io
with io.open("test", mode="r", encoding="utf8") as fd:
...
在这里,我假设您的文件使用uft8编码。
使用with
语句确保即使发生错误(异常),文件也会在读取结束时关闭。要了解有关上下文管理器的更多信息,请查看Context Library。
有几种方法可以读取文本文件:
fd.read()
或for line in fd
。如果您阅读整个文件,则需要拆分行(请参阅str.splitlines。以下是两种解决方案:
with io.open("test", mode="r", encoding="utf8") as fd:
content = fd.read()
for line in content.splilines():
if "Hello" in line:
print("55" + line + "55")
if "World" in line:
print("66" + line + "66")
或者
with io.open("test", mode="r", encoding="utf8") as fd:
for line in content.splilines():
line = line[:-1]
if "Hello" in line:
print("55" + line + "55")
if "World" in line:
print("66" + line + "66")
如果您需要将结果写入另一个文件,您可以在写入模式下打开输出文件并使用print(thing, file=out)
,如下所示:
with io.open("test", mode="r", encoding="utf8") as fd:
with io.open("test", mode="w", encoding="utf8") as out:
for line in content.splilines():
line = line[:-1]
if "Hello" in line:
print("55" + line + "55", file=out)
if "World" in line:
print("66" + line + "66", file=out)
如果您使用Python 2,则需要以下指令才能使用print函数:
from __future__ import print_function