【问题标题】:How do I edit a text file in Python?如何在 Python 中编辑文本文件?
【发布时间】:2014-12-31 18:51:58
【问题描述】:
text = open('samiam.txt', 'r+')
keyword = " i "
keyword2 = "-i-"
replacement = " I "
replacement2 = "-I-"

for line in text:    
    if keyword in line:
        text.write(line.replace(keyword, replacement))
        print line
    elif keyword2 in line:
        text.write(line.replace(keyword2, replacement2))
        print line
    else:
        print line
text.close()

我不完全确定为什么没有将文本写入文件。帮忙?

【问题讨论】:

  • 您能否展示一下您的文件样本。
  • 我是 Sam Sam,我就是 Sam-i-am!那个山姆我是!我不喜欢那个 Sam-i-am!你喜欢绿鸡蛋和火腿吗?我不喜欢他们,Sam-i-am。我不喜欢绿鸡蛋和火腿。
  • 也许,您没有以写入或追加模式打开文件
  • 您不写入文件,而是写入标准输出。那么为什么要写入文件呢?
  • @Andrea 永远不要转录您的代码,而是复制并粘贴它...

标签: python python-2.7


【解决方案1】:

在您的代码中只需替换该行

for line in text:

for line in text.readlines():

请注意,这里我假设您尝试在文件末尾添加输出。读取整个文件后,文件指针位于文件末尾(即使您以r+ 模式打开文件)。因此,执行写入实际上会在当前内容之后写入文件末尾。

您可以通过在不同行嵌入text.tell() 来检查文件指针。

这是另一种方法:

with open("file","r") as file: 
    text=file.readlines() 
i=0 
while i < len(text): 
    if keyword in text[i]: 
        text[i]=text[i].replace(keywork,replacement) 
with open("file","w") as file: 
    file.writelines(text)

【讨论】:

  • 我不是反对你的人,但我确实检查了这个答案,它似乎没有改变任何东西。
  • 实际上它确实改变了一些东西,但它所做的描述很差,可能不是你想要的。在诅咒和糟糕的格式之间,他想说的是,当您正在读取文件时,您无法写入文件的末尾。更改修复了该问题,但最终将新输出附加到文件末尾,而不是重写文件。
  • 我已经提到,在阅读了代码后,我只是假设。另外,如果您真的想重写,为什么不打开文件将其保存在列表中,然后在修改列表后将其写回。代码的问题是,在读取文件后,文件指针移动到末尾,因此除非您移动文件指针,否则无法重写现有行。
  • 和@tripleee 就格式不佳而言,您可以检查我是否从昨天开始,但我仍在努力尽可能准确。我真的不知道什么是正确的格式规则并且还在学习。安德里亚,我知道你没有投反对票,我也没有指向你,因为你没有像我一样投反对票所需的积分。
  • 是的,r+ 既读取文件又写入文件。但我认为问题出在文件指针上。检查这些链接,以防你没有看到它们。 stackoverflow.com/questions/14271216/…bugs.python.org/issue3207
【解决方案2】:

使用fileinput module。 (另见the MOTW site。)

import fileinput
keyword1 = " i "
keyword2 = "-i-"
replacement1 = " I "
replacement2 = "-I-"
for line in fileinput.input('your.file', inplace=True):
    line = line.rstrip()
    if keyword1 in line:
        line = line.replace(keyword1, replacement1)
    elif keyword2 in line:
        line = line.replace(keyword2, replacement2)
    print line

fileinput 模块,当您使用 inplace 选项时,会重命名输入文件并将标准输出重定向到具有原始文件名的新文件

如果你想保留每一行右边的空白,不要rstrip,使用print line,(注意最后的逗号)输出处理后的行。

【讨论】:

  • 什么是“line.rstrip()” 我理解去除空格的概念...但是为什么前面是'r'?
  • 从两侧剥离、从左侧剥离和仅从右侧剥离有不同的功能。 rstrip 仅从右侧删除,即从字符串的末尾开始。
  • 剥离多少钱?假设这条线是“我不喜欢他们,山姆-我-我”。 ...那会发生什么变化?
  • 'r' 代表'正确'。这里我们使用print,它在它打印的内容中添加一个换行符,所以如果line在输出文件中包含一个换行符,那么所有的文本行都将被一个空行分隔。为了避免这种行为,我们去掉了右边的所有空格,假设左边的空格很重要(读为“缩进很重要”),而右边的空格可以被牺牲来获得正确的输出格式。如果您想保留所有空格,请不要使用rstrip 并使用print line,(带有最后一个逗号),这样就不会再添加新的换行符了。
  • 我不得不说,显然你不知道你从文件中读取的每一行都由换行符终止......你正在处理的行不是“我不喜欢他们,山姆-我-我。”而是“我不喜欢他们,sam-i-am.\n”,你看出区别了吗?
【解决方案3】:

这是因为您试图同时读取和写入。尝试类似:

# Read operation
lines = []
for line in text.readlines():
    if keyword in line:
        lines.append(line.replace(keyword, replacement))
        print line
    elif keyword2 in line:
        lines.append(line.replace(keyword2, replacement2))
        print line
    else:
        lines.append(line)
        print line
text.close()

# Write operation
text = open('dummy.py', 'w+')
text.writelines(lines)
text.close()

奖金:

with open('data.txt') as f:
     data = f.read()

更pythonic。

【讨论】:

    【解决方案4】:

    最好使用两个描述符——一个用于读取,另一个用于写入,用于可读性和单次写入操作。

    text_read = open('samiam.py', 'r').read()
    words_replacer_dict = {" i " : " I ", "-i-" : "-I-"}
    replaced_text = ""
    
    for line in text_read.split("\n"):
        for word, new_word in words_replacer_dict.items():
            replaced_text += line.replace(word, new_word)
    
    text_read.close()
    text_write = open('samiam.py', 'w')
    text_write.write(replaced_text)
    text_write.close()
    

    如果您在这种情况下对内存感到困扰,您甚至可以保持计数并根据计数进行写入。只需使用生成器表达式以读取模式打开文件并保持引用计数以满足写入操作。 注意:阅读here(非官方链接),以更好地了解字典方法。

    但是,如果您更喜欢使用读写,请始终使用查找操作来获取要替换的行,并在完成文件写入后使用刷新。但是,您不能通过 seek 和 flush 方法替换文件中已经存在的行。您只能在文件中添加一些内容。 (例如)

    text = open('samiam.py', 'r+')
    count = 1
    new_text = ""
    for line in text:
        new_text += "%d:%s\n" % (count, line)
        count += 1
    text.seek(0)
    text.truncate()
    text.write(new_text)
    text.seek(0)
    for line in text:
        print line
    text.close()
    

    要更好地了解为什么无法按照您的意愿读写文件,请参阅here

    【讨论】:

    • new_word 是字典中的值(如“I”、“-I-”)。
    • “为了更好地了解为什么......”链接说:“不幸的是,没有办法在不重写的情况下插入文件中间”......但我我可以重写它......我想。
    • 字典末尾的“items”有什么作用?我查了一下,还是不明白……
    • items 会以两个值元组列表的形式为您提供字典。比如 {'a':1, 'b':2} => [('a',1), ('b', 2)]
    猜你喜欢
    • 1970-01-01
    • 2020-07-10
    • 2018-12-19
    • 1970-01-01
    • 2017-07-10
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多