我有一个似乎没有打开文件的python脚本。 脚本中的文件夹定义如下:
logdir = "C:\\Programs\\CommuniGate Files\\SystemLogs\\"
submitdir = "C:\\Programs\\CommuniGate Files\\Submitted\\"
这是路径的使用方式:
filenames = os.listdir(logdir)
fnamewithpath = logdir + fname
我在Windows 7 sp1中运行此脚本 这看起来是否正确? 我可以在代码中调试它以确保文件正在打开吗?
谢谢,
Docfxit
编辑提供更多说明:
打开和关闭文件的实际代码如下:
# read all the log parts
for fname in logfilenames :
fnamewithpath = logdir + fname
try :
inputFile = open(fnamewithpath, "r")
except IOError as reason :
print("Error: " + str(reason))
return
if testing :
print("Reading file '%s'" % (fname))
reporter.munchFile(inputFile)
inputFile.close()
# open output file
if testing :
outfilename = fullLognameWithPath + ".summary"
fullOutfilename = outfilename
else :
outfilename = submitdir + "ls" + str(time.time()) + "-" + str(os.getpid())
fullOutfilename = outfilename + ".tmp"
try :
outfile = open(fullOutfilename, "w")
except IOError :
print("Can't open output file " + fullOutfilename)
return
if not testing :
# add the mail headers first
outfile.write("To: " + reportToAddress + "\n")
outfile.write("From: " + reportFromAddress + "\n")
outfile.write("Subject: CGP Log Summary new for " + logname + "\n")
if useBase64 :
outfile.write("Content-Transfer-Encoding: base64\n")
outfile.write("\n")
# save all this as a string so that we can base64 encode it
outstring = ""
outstring += "Summary of file: " + fullLogname + partAddendum + "\n"
outstring += "Generated " + time.asctime() + "\n"
outstring += reporter.generateReport()
if useBase64 :
outstring = base64.encodestring(outstring)
outfile.write(outstring)
outfile.close()
if not testing :
# rename output file to submit it
try :
os.rename(outfilename + ".tmp", outfilename + ".sub")
except OSError :
print("Can't rename mail file to " + outfilename + ".sub")
我原本想知道路径中包含的双反斜杠是否正确。 我无法弄清楚为什么它没有正确地产生输出。
以防万一有人想看到我发布的整个脚本: 上半场是:
下半场是:
太大了,无法将所有内容发布在一起。
这是在Python 3.2.2中运行
非常感谢您的关注,
Docfxit
答案 0 :(得分:0)
上面写的代码实际上并没有打开任何一个文件。
os.listdir
返回指定路径中的文件列表(技术上条目,因为还包括.
和..
等非文件),但实际上并没有打开它们。为此,您需要在其中一条路径上调用open
函数。
如果您想在filenames
中打开 write 的所有文件,可以执行以下操作:
fileList = []
for f in filenames:
if os.path.isfile(fullPath):
fullPath = os.path.join(logdir, f)
fileList.append(open(fullPath, 'w')
在此之后,列表fileList
将包含所有文件的打开文件句柄,然后可以迭代(例如,如果要复用输出,则全部写入)。 / p>
注意,完成后,您应该循环遍历列表并明确close
它们全部(自动关闭它们的with
语法在动态大小的列表中具有额外的复杂性/限制,并且最好避免在这里,IMO)。
有关文件的更多信息,请参阅: Reading and Writing Files
此外,最好使用os.path.join
来组合路径的组件。这样它就可以在支持的平台上移植,并且会自动使用正确的路径分隔符等。
根据OP的评论进行编辑:
我建议你使用调试器逐步查看代码,看看究竟出了什么问题。我使用pudb,这是一个增强的命令行调试器,并发现它非常有价值。您可以通过 pip 将其安装到您的system / virtualenv Python环境中。