我有一些带有这些行的文本文件:
Zip=false
Run=false
Copy=true
FileName=c:\test\test.doc
现在,我需要加载此文本文件,更改一些值并写回相同的文本文件。 所以我将其加载到字典中,更改字典中的值并写回。
问题在于FileName路径中的反斜杠被重复,并且在新文件中,我得到FileName = c:\ test \ test.doc。
这是字典的创建:
def create_dictionary(filename):
try:
file = open(filename, 'r')
except:
print("Error " + filename + " not found or path is incorrect")
else:
contents = file.read().splitlines()
properties_dict = {}
for line in contents:
if not line.startswith("#") and line.strip():
# print (line)
x, y = line.split("=")
properties_dict[x] = [y]
return properties_dict
此处正在写回文件
# Update the properties file with updated dictionary
fo = open(properties_file, "w")
for k, v in dic.items():
print(str(k), str(v))
fo.write(str(k) + '=' + str(v).strip("[]'") + '\n')
fo.close()
答案 0 :(得分:2)
这似乎有效:
def create_dictionary(file_name):
try:
properties_dict = {}
with open(file_name, "r") as file:
contents = file.read().splitlines()
for line in contents:
if not line.startswith("#") and line.strip():
property_name, property_value = line.split("=")
properties_dict[property_name] = property_value
return properties_dict
except FileNotFoundError:
print(f"Error {file_name} not found or path is incorrect")
def dict_to_file(properties_dict, file_name):
try:
file_dirname = os.path.dirname(file_name)
if not os.path.exists(file_dirname):
os.makedirs(file_dirname)
except FileNotFoundError: # in case the file is in the same directory and "./" was not added to the path
pass
with open(file_name, "w") as file:
for property_name, property_value in properties_dict.items():
file.write(f"{property_name}={property_value}\n")
properties_dict = create_dictionary("./asd.txt")
dict_to_file(properties_dict, "./bsd.txt")
由于有更多解释的要求,我正在编辑此帖子。 实际上,关键部分不是@ pktl2k指出的 file.write(f“ ...”)。关键部分是将 properties_dict [x] = [y] 更改为 properties_dict [x] = y 。
在Python字符串中,如果要转义特殊字符,请使用反斜杠(\)。文件中的 FileName 参数具有这些特殊字符之一,它们也是反斜杠(FileName = c:\ test \ test.doc)。因此,当您读取此文件时,Python将其存储为以下字符串:
“ c:\\ test \\ test.doc”
这是完全正常的。而且,当您想将此字符串写回到文件中时,将获得所需的输出(没有双反斜杠)。但是,在您的代码中,您没有将此值作为字符串。您可以将其作为列表并将其保存为字符串。当您在列表上调用 str 内置函数(顺便说一句是内置类)时,列表类的 __ repr __ 函数被称为(实际上是 __ str __ 被调用,但是据我所知,在列表 __ str __ 中调用 __ repr __ ,但我们不要过多地介绍这些细节函数。如果您想了解更多信息,请参见this link,以获取列表的字符串表示形式。在此过程中,所有列表都将按原样转换为字符串。然后,使用 strip(“ []'”)消除此字符串表示形式中的某些字符,这是导致问题的真正原因。
现在,为什么我要从头开始编写所有内容,而不仅是@ pktl2k亲切要求的重要部分。原因是因为如果您在 create_dictionary 函数中注意到,作者忘记了使用 file.close()关闭文件。这是一个常见的问题,这就是为什么 with open(....)这样的语法的原因。我想强调一点:每当我们要操纵文件内容时,最好使用和open(...)语法。我也可以把它写成一个小纸条,但是我认为用这种方法会更好(所以这是个人喜好)。