逐行读取和写入文本文件的问题

时间:2013-08-15 10:07:09

标签: python python-2.7 pyqt

该脚本使用PyQt4.10.1和Python2.7

编写

我一直在研究一个简单的工具,允许用户搜索路径,然后将它们保存到配置文件中,供其他程序稍后阅读。如果已有配置文件,则脚本会读取该文件,并显示用户要编辑或添加的现有路径。我写了一个gui,以使其尽可能用户友好。我遇到了几个问题。

首先,当我在配置文件中读到时,我使用以下代码:

try:
    self.paths = open(configFile, "r")
    self.data = self.paths.readlines()
    self.paths.close()
except:
    self.data = None

if self.data is not None:
        for line in self.data:
            print line
            #self.listDelegate is the model for my QListView
            self.listDelegate.insertRows(0, 1, line)

当我这样做时,我在gui中得到以下内容:

This is how it looks when you first input the data

这(上图)是您第一次输入数据时的样子(在保存数据然后重新打开之前)

This is how the data looks after the config file is saved and then reopened

这(上图)是保存配置文件后再读回数据的方式(注意路径下方的额外空间)。

仅在首次打开脚本时读取配置文件。 以下是配置文件写出时的外观。

C:\Program Files
C:\MappedDrives
C:\NVIDIA

现在所有这些都不是什么大问题但是当我打开配置文件用这个工具编辑它时,gui中的额外空间被读作另一个换行符。所以配置文件打印为:

C:\Program Files

C:\MappedDrives

C:\NVIDIA

然后每次编辑文件时问题都变得越来越大。

这个问题引发了我的第二个问题(我认为可能是罪魁祸首)。当我将gui中的行写入配置文件时,我使用以下代码:

    rowCount = self.listDelegate.rowCount()

    if rowCount > 0:

        myfile = open(configFile, 'w')

        for i in range(rowCount):
            myfile.write(str(self.listDelegate.index(i).data(role = QtCore.Qt.DisplayRole).toPyObject()))
            myfile.write("\n")

        myfile.close()

我假设额外换行的问题是因为我手动添加换行符。问题是我需要每个路径都在自己的行上,以便稍后可以使用配置文件。我没有很多编写文本文件的经验,每个人都说逐行编写它们的最简单方法是手动添加换行符。如果有人有任何更好的想法,我很乐意听到。

很抱歉这个冗长的解释。如果我不够清楚,请告诉我,我会更好地解释自己。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

问题在于,每次读取文件时,换行符都会保留在行尾。来自description of readline

  

f.readline()从文件中读取一行;换行符(\n)留在字符串的末尾,如果文件没有以换行符结尾,则只在文件的最后一行省略。

如果您尝试

self.paths = open(configFile, "r")
self.data  = self.paths.readlines()
for line in self.data:
    print repr(line)

将每行的表示形式打印为python代码,您将得到类似

的内容
'C:\\Program Files\n'
'C:\\MappedDrives\n'
'C:\\NVIDIA\n'

当您稍后插入更多换行符时,最简单的修复可能是remove the trailing newline

for line in self.data:
    strippedLine = line.rstrip('\n')