Python .app无法读取.txt文件



这个问题与这个问题有关:Python应用程序以.app/exe 的形式读取和写入其当前工作目录

我对.txt文件的路径很好,但现在当我试图打开它并读取内容时,它似乎没有正确提取数据。

这是相关代码:

def getLines( filename ):
path = Cocoa.NSBundle.mainBundle().bundlePath()
real_path = path[0: len(path) - 8]
print real_path
f = open(real_path + filename, 'r') # open the file as an object
if len(f.read()) <= 0:
lines = {}                  # list to hold lines in the file
for line in f.readlines():  # loop through the lines
line = line.replace( "r", "    " )
line = line.replace( "t", "    " )
lines = line.split("    ")      # segment the columns using tabs as a base
f.close()                   # close the file object
return lines
lines = getLines( "raw.txt" )
for index, item in enumerate( lines ):        # iterate through lines
# ...

这些是我得到的错误:

  • 2012年9月30日10:28:49.103[0x0-0x4e04e].org.pythonmac.unsspecified.main:对于索引,枚举(行)中的项:#遍历行
  • 2012年9月30日10:28:49.103[0x0-0x4e04e].org.pythonmac.unsspecified.main:TypeError:"NoneType"对象不可迭代

我有点理解错误的含义,但我不确定为什么要标记它们,因为如果我在不以.app形式运行脚本,它就不会得到这些错误,也不会很好地提取数据。

如果不重置读取指针,就无法读取一个文件两次。此外,您的代码主动阻止正确读取您的文件。

您的代码当前执行以下操作:

f= open(real_path + filename, 'r')  # open the file as an object
if len(f.read()) <= 0:
lines = {}                  # list to hold lines in the file
for line in f.readlines():  # loop through the lines

.read()语句可以一次性将整个文件读取到内存中,从而导致读取指针移动到末尾。.readlines()上的循环不会返回任何内容。

但是,只有当.read()调用没有读取任何内容时,才运行该代码。你基本上是在说:如果文件是空的,就读行,否则什么都不读。

最后,这意味着getlines()函数总是返回None,稍后会导致您看到的错误。

完全松开if len(f.read()) <= 0:

f= open(real_path + filename, 'r')  # open the file as an object
lines = {}                  # list to hold lines in the file
for line in f.readlines():  # loop through the lines

然后,您就不需要对lines = {}做任何操作,因为对于文件中的每一行,您都替换lines变量:lines = line.split(" ")。您可能想创建一个列表,并附加:

f= open(real_path + filename, 'r')  # open the file as an object
lines = []              # list to hold lines in the file
for line in f.readlines():  # loop through the lines
# process line
lines.append(line.split("    "))

另一个提示:real_path = path[0: len(path) - 8]可以重写为real_path = path[:-8]。不过,您可能希望查看os.path模块来操作您的路径;我怀疑os.path.split()电话会更好、更可靠地为您服务。

相关内容

  • 没有找到相关文章

最新更新