为什么我的文件中的内容被替换了?
Why are the contents in my file being replaced?
我是 Python 的初学者。我打开了一个文件并尝试使用 TextReader class.
用它替换旧数据
我在 PyCharm 上多次尝试调试代码,但我无法理解发生了什么。
这是 TextReader class。
class TextReader:
def __init__(self, spec):
self.file = open(spec, 'r+')
self.text = self.file.read()
self.lines = 0
for _ in self.file:
self.lines += 1
def replace(self, old, new):
replace = ''
for line in self.file:
replace += line.replace(old, new) + '\n'
self.file.write(replace)
t = TextReader('temp.txt')
t.replace('good', 'bad')
print(t.text)
print(t.lines)
在运行程序之前,temp.txt包含:-
Python is a good programming language.
这是以下代码的输出:-
0
我打开运行程序后的temp.txt文件,发现里面是空的。
请帮忙!
file
对象有一个内部文件 "offset",只要您 read/write/seek 在该文件中,该文件就会更改。因此,您隐含地多次阅读到最后,并且永远不会 seek
返回任何地方,例如:
- 您的
file.read()
将一直读取到文件末尾
- 你做
for _ in self.file
和 for line in self.file
这些遍历每一行
所有这些都会在最后留下偏移量。如果您不 seek
再次回到开头,您将一无所获,因为所有这些操作都从 "current offset"
开始
我建议按照@tripleee 的建议进行阅读一次,然后将其分成几行然后使用它,而不是反复尝试从文件的不同部分重新读取相同的数据
文件是 Python 中的迭代器,因此您只能读取文件句柄一次。你关心在这里尝试读取同一个句柄三次,所以最后两次什么都不做:
class TextReader:
def __init__(self, spec):
self.file = open(spec, 'r+')
self.text = self.file.read() # < reads the iterator -- it is now spent
self.lines = 0
for _ in self.file: # < try to read again does nothing
self.lines += 1 # < this never runs
def replace(self, old, new):
replace = ''
for line in self.file: # < try to read again; loop again doesn't run
replace += line.replace(old, new) + '\n'
self.file.write(replace)
如果您想计算行数然后逐行读取这些行,只需将文件读入列表即可。然后 count
将是列表的长度。类似于:
class TextReader:
def __init__(self, spec):
self.file = open(spec, 'r+')
# alternative to below:
# self.lines = list(self.file)
self.lines = []
for line in self.file:
self.lines.append(line)
def replace(self, old, new):
replace = ''
for line in self.lines:
replace += line.replace(old, new) + '\n'
self.file.write(replace)
self.file.close() # remember to close the file!
t = TextReader('test.txt')
t.replace('good', 'bad')
print(t.lines)
print(len(t.lines))
这将生成一个包含两行的文件——您的原始行和带有 good
的附加行替换为 bad
。这是因为您以 r+
打开,这意味着追加。
其他答案解释了为什么您的代码不起作用。因此,完成后需要关闭文件是正确的,否则会导致内存泄漏。我还建议使用 with
,因为它会自动为您打开和关闭文件。我就是这样做的。
class TextReader:
def __init__(self, spec):
self.file = spec
self.text = ''
self.lines = 0
with open(spec, 'r') as f:
for line in f:
self.text += line
self.lines += 1
def replace(self, old, new):
with open(self.file, "w") as f:
r = ''
for line in self.text.split("\n"):
r += line.replace(old, new) + '\n'
f.write(r)
t = TextReader('temp.txt')
t.replace('good', 'bad')
print(t.text)
print(t.lines)
它会自动为您关闭文件并重新打开以覆盖当前文本替换您想要的单词,因为 'r+' 将附加到文件末尾。
我是 Python 的初学者。我打开了一个文件并尝试使用 TextReader class.
用它替换旧数据我在 PyCharm 上多次尝试调试代码,但我无法理解发生了什么。
这是 TextReader class。
class TextReader:
def __init__(self, spec):
self.file = open(spec, 'r+')
self.text = self.file.read()
self.lines = 0
for _ in self.file:
self.lines += 1
def replace(self, old, new):
replace = ''
for line in self.file:
replace += line.replace(old, new) + '\n'
self.file.write(replace)
t = TextReader('temp.txt')
t.replace('good', 'bad')
print(t.text)
print(t.lines)
在运行程序之前,temp.txt包含:-
Python is a good programming language.
这是以下代码的输出:-
0
我打开运行程序后的temp.txt文件,发现里面是空的。 请帮忙!
file
对象有一个内部文件 "offset",只要您 read/write/seek 在该文件中,该文件就会更改。因此,您隐含地多次阅读到最后,并且永远不会 seek
返回任何地方,例如:
- 您的
file.read()
将一直读取到文件末尾 - 你做
for _ in self.file
和for line in self.file
这些遍历每一行
所有这些都会在最后留下偏移量。如果您不 seek
再次回到开头,您将一无所获,因为所有这些操作都从 "current offset"
我建议按照@tripleee 的建议进行阅读一次,然后将其分成几行然后使用它,而不是反复尝试从文件的不同部分重新读取相同的数据
文件是 Python 中的迭代器,因此您只能读取文件句柄一次。你关心在这里尝试读取同一个句柄三次,所以最后两次什么都不做:
class TextReader:
def __init__(self, spec):
self.file = open(spec, 'r+')
self.text = self.file.read() # < reads the iterator -- it is now spent
self.lines = 0
for _ in self.file: # < try to read again does nothing
self.lines += 1 # < this never runs
def replace(self, old, new):
replace = ''
for line in self.file: # < try to read again; loop again doesn't run
replace += line.replace(old, new) + '\n'
self.file.write(replace)
如果您想计算行数然后逐行读取这些行,只需将文件读入列表即可。然后 count
将是列表的长度。类似于:
class TextReader:
def __init__(self, spec):
self.file = open(spec, 'r+')
# alternative to below:
# self.lines = list(self.file)
self.lines = []
for line in self.file:
self.lines.append(line)
def replace(self, old, new):
replace = ''
for line in self.lines:
replace += line.replace(old, new) + '\n'
self.file.write(replace)
self.file.close() # remember to close the file!
t = TextReader('test.txt')
t.replace('good', 'bad')
print(t.lines)
print(len(t.lines))
这将生成一个包含两行的文件——您的原始行和带有 good
的附加行替换为 bad
。这是因为您以 r+
打开,这意味着追加。
其他答案解释了为什么您的代码不起作用。因此,完成后需要关闭文件是正确的,否则会导致内存泄漏。我还建议使用 with
,因为它会自动为您打开和关闭文件。我就是这样做的。
class TextReader:
def __init__(self, spec):
self.file = spec
self.text = ''
self.lines = 0
with open(spec, 'r') as f:
for line in f:
self.text += line
self.lines += 1
def replace(self, old, new):
with open(self.file, "w") as f:
r = ''
for line in self.text.split("\n"):
r += line.replace(old, new) + '\n'
f.write(r)
t = TextReader('temp.txt')
t.replace('good', 'bad')
print(t.text)
print(t.lines)
它会自动为您关闭文件并重新打开以覆盖当前文本替换您想要的单词,因为 'r+' 将附加到文件末尾。