在你说它重复之前......我已经阅读了至少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'
答案 0 :(得分:3)
你想要做的事情是不切实际的 - 用任何语言。
首先,正如其他人所说,文件对象上没有replace()
方法。
更重要的是,您似乎并不了解文本文件的工作原理。你说:“我每次创建新文件时都会看到一些答案”。你有没有考虑为什么他们这样做?
“我只需要为特定行添加+1”
让我们在认为的文本文件中使用几行:
onetwomumble9
threefourmumble3
但是文本文件并不特别,它只是从第一个字节到最后一个字节,新行显示行结束的位置。它看起来真的像这样:
onetwomumble9\nthreefourmumble3\n
\n
表示单个换行符。
假设您确实将9
替换为10
,将3
替换为4
。问题是10
比9
更宽,额外的字符将覆盖后面的换行符(或任何其他字符)。所以你最终得到了这个:
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