这个问题与这个问题有关: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()
电话会更好、更可靠地为您服务。