对象没有尝试读取file.txt的属性'replace'

时间:2016-06-03 06:02:20

标签: python python-3.x

在你说它重复之前......我已经阅读了至少15个其他答案而无法成功...

我在尝试替换特定行时遇到此错误。 现在它告诉我它没有替换属性......它在某些时候具有

每次确定的事件发生时,我只需要为特定的行添加+1 ...并尝试了这个......这可能是一个粗略的解决方案。

我每次创建一个新文件时都会看到一些答案,因为这个事件应该一直发生,所以不会有效

所以我在这里问的是......为什么替换功能不起作用......和/或如果还有其他更简单的功能,我在做什么。

代码:

usercidFile = str(usercid) +".txt"

with open(usercidFile,'r+') as uf:
    lines = uf.readlines()

    xName = str(lines[1])
    x = lines[4]    
    xx = lines[2]
    y = int(x)+1
    #it prints all vars until this point
    uf = uf.replace(str(x),str(y))

◙◙其中出现以下错误:

  File "/home/ubuntu/workspace/bot.py", line 49, in listener
uf = uf.replace(str(x),str(y))
AttributeError: '_io.TextIOWrapper' object has no attribute 'replace'

3 个答案:

答案 0 :(得分:3)

你想要做的事情是不切实际的 - 用任何语言。

首先,正如其他人所说,文件对象上没有replace()方法。

更重要的是,您似乎并不了解文本文件的工作原理。你说:“我每次创建新文件时都会看到一些答案”。你有没有考虑为什么他们这样做?

“我只需要为特定行添加+1”

让我们在认为的文本文件中使用几行:

onetwomumble9
threefourmumble3

但是文本文件并不特别,它只是从第一个字节到最后一个字节,新行显示行结束的位置。它看起来真的像这样:

onetwomumble9\nthreefourmumble3\n

\n表示单个换行符。

假设您确实将9替换为10,将3替换为4。问题是109更宽,额外的字符将覆盖后面的换行符(或任何其他字符)。所以你最终得到了这个:

onetwomumble10threefourmumble4\n

你丢了换绳!

这就是为什么你必须复制文件来更新它!另一种方法是使用处理这些问题的数据库(如SQLite)。

有一些解决方法。最简单的方法是确定绝对最大字符数,并使用零填充,例如0009更新为0010

假设文件看起来像这样:

onetwomumble0009
threefourmumble0005
sixsevenmumble0067
eightnonemumber0042

要读取和写入同一文件,您必须自己维护文件位置。当你读取一行时,它会将当前位置放到下一行,因此要重写一行,你必须将其移回。 示例代码:

import re
import sys

# Could be done as a one-line lambda, but would be difficult to read
def addit(m):
    num = m.groups()[0]
    new_num = "%04d" % (int(num) + 1)
    return new_num

line_number = 1

with open('gash.txt', 'r+') as uf:
    while True:
        start_pos = uf.tell()  # Get start of line position
        line = uf.readline()
        if not line : break
        end_pos = uf.tell()  # Get end of line position - needed if updating more than one line

        # Let's say we update line 2, and we decided on 4 chars
        if line_number == 2: 
            # Do the add
            newline = re.sub(r'(\d{4})$', addit, line)


            # Sanity check
            if len(newline) != len(line):
                print("line length changed!", line, file=sys.stderr)
                sys.exit(1)

            # Seek to start of line just read and write
            uf.seek(start_pos)
            uf.write(newline)
            # Seek to start of next line
            uf.seek(end_pos)

            # If we only wanted to update one line, we can:
            break

        line_number += 1

答案 1 :(得分:1)

显然,"field": { "type": "text" } 即文件对象不具有字符串函数的替换方法。我想你正试图在整个文件中进行替换。这是一个快速解决方案。

_io.TextIOWrapper

答案 2 :(得分:1)

问题是您尝试在#include <stdio.h> #include <pthread.h> int main() { pthread_t f1_thread; return 0; } 对象上调用replace方法,而这是file方法。

确实:

string