将文本文件读入String

时间:2016-10-09 13:42:20

标签: python

我刚开始学习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

非常感谢任何帮助。

4 个答案:

答案 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