我正在编写一个简单的解析器。现在,它会读取整个当前目录并打开文件' r'和' w'所有以" .w"结尾的文件的权限。这是代码:
import os
wc_dir = os.path.dirname(os.path.abspath(__file__))
files = [f for f in os.listdir(wc_dir) if os.path.isfile(os.path.join(wc_dir,f))]
comp_files_r = [open(f, 'r') for f in files if f.endswith(".w")]
comp_files_w = [open(f, 'w') for f in files if f.endswith(".w")]
正如你所看到的,我有两个带有"开放对象的列表"具有对当前文件夹中以" .w"结尾的所有文件的读写权限。现在,我只有一个档案。因此,请考虑以下事项:
print comp_files_r
print comp_files_w
输出:
[<open file 'app.w', mode 'r' at 0x7effd48274b0>]
[<open file 'app.w', mode 'w' at 0x7effd4827540>]
当我尝试阅读&#39; app.w&#39;文件:
def parse():
for f in comp_files_r:
with f as file:
data = file.read()
print repr(data)
parse()
我无缘无故地得到一个令人惊讶的空字符串。我已经设法发现了,我保存的所有内容都适用于&#39; app.w&#39;当我使用&#34; w list comprehension&#34;执行代码时会被删除。那为什么呢?我从痛苦中学到了试图在&#34; r +&#34;中读取和写入文件。模式可能导致奇怪的结果。情况并非如此。我已经在同一个文件中创建了不同的对象,而这个正在弄乱文件本身的内容。为什么呢?
答案 0 :(得分:2)
在我看来,您的问题是您以'w'模式打开文件。以“w”模式打开文件时,将删除当前文件并替换为新文件。 'r +'模式用于阅读和编辑。
我愿意打赌,如果您在打开它们的行之间读取文件的内容以及打开它们进行写入的行,您将看到文件的内容,正如您所期望的那样他们是。