【问题标题】:os.path.isfile on an External file with full path names具有完整路径名的外部文件上的 os.path.isfile
【发布时间】:2015-12-18 10:00:24
【问题描述】:

新的 python 编码器。

设置一个非常基本的脚本来删除不同位置的各种文件, 本质上,一个防病毒脚本。该脚本似乎运行没有问题:

import os
my_tup = (
'/Users/kevin/Desktop/python/folder1/deleteme.txt',
'/Users/kevin/Desktop/python/folder2/deleteme.txt',
'/Users/kevin/Desktop/python/folder3/deleteme.txt')

for value in my_tup:
    if os.path.isfile(value):
        print (value, 'File exists\n')
    else:
        print (value, 'File Not Found\n')

我希望我的列表会变得很长,所以我现在使用一个可以添加的外部文件。外部文件只是路径名的元组。但是,现在循环说不存在任何文件,除了循环中的最后一个条目?

import os
datafile = open("data.txt","r")
for value in datafile.readlines():
    if os.path.exists(value):
        print (value, 'File exists\n')
    else:
        print("Sorry, file does not exist: %s" % value)
datafile.close()

这段代码的输出是:

抱歉,文件不存在:/Users/kevin/Desktop/python/folder1/deleteme.txt

抱歉,文件不存在:/Users/kevin/Desktop/python/folder2/deleteme.txt

抱歉,文件不存在:/Users/kevin/Desktop/python/folder3/deleteme.txt

/Users/kevin/Desktop/python/folder1/deleteme.txt 文件存在

希望这是有道理的。 谢谢

【问题讨论】:

  • 请修正你的第二个代码块的缩进,现在你有一个for-else 语句,我希望这不是你实际运行的语句
  • 如果您键入的代码与此处显示的完全相同,则问题是缩进,因为 else 子句与 for 循环处于相同的缩进级别,而不是 if 条件。在 Python 中,你可以在 for 后面加上 else 子句。检查一下。
  • 顺便说一句,您可以将for value in datafile.readlines(): 替换为for value in datafile:,因为文件对象将迭代文件的行。
  • @tdelaney: s/can replace/should replace/; .readlines() 会急切地吞下整个文件,直到读入整个文件才开始迭代,因此它比直接迭代文件对象更慢并且需要更多内存。
  • 另外,请使用with 语句。显式的.close()容易因为异常而忘记或跳过;以with open("data.txt","r") as datafile: 开头的块不需要close;当控制流离开with 块时,它会自动发生。

标签: python


【解决方案1】:

您可能在每行末尾都有换行符 (\n)。

尝试在每一行调用value.strip() 以删除换行符。

for value in datafile.readlines():
    value = value.strip()
    ... rest of code ...

【讨论】:

  • 你不能在你的 for 循环结构中调用 strip
  • 我认为将value = value.strip() 更改为value = value.rstrip('\n') 也可以!我说的对吗?
  • @Pardoido,如果文件恰好在行首包含任何空格,例如\t,则不会。
  • 只要您不以二进制模式打开文件,datafile.read().split('\n') 也应该可以正常工作。在这种情况下,splitlines() 可以解决这个问题。
  • 为了加快速度并避免一次吞下整个文件,读取剥离行的最佳方法是for value in map(str.rstrip, datafile):(或str.strip,如果前导也应该删除);如果是 Python 2,请确保 from future_builtins import map 如此 map 不会急切地吞食整个文件(使用无限量的内存)。
猜你喜欢
  • 2014-09-26
  • 1970-01-01
  • 2017-05-20
  • 2011-01-08
  • 1970-01-01
  • 2011-04-19
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多