【问题标题】:python List files with spacespython 列出带空格的文件
【发布时间】:2023-12-22 10:12:02
【问题描述】:

我有以下代码:

基本上是从每个文件中拉取md5。问题在于有空格的文件,程序的解决方案可以考虑这些文件而不是跳过它们。

def onepath(archivo):
        logging.basicConfig(filename=salida,filemode="w", format='%(message)s', level=logging.DEBUG)
        for filename in (file for file in os.listdir(archivo)):
                with open(filename) as checkfile:
                        logging.info("MD5 " + "(%s) = " % filename + hashlib.md5(checkfile.read()).hexdigest())

我正在阅读有关方法 shlex 的信息,但不确定如何实现。

你能帮帮我吗?


我认为带有空格的文件正在显示。我做了一个简短的 sn-p,但我没有遇到一个我无法控制 Linux 如何理解文件名上的空格的问题,以便执行以下操作:

files_destino = [f for f in os.listdir(os.path.join(sys.argv[1].strip()))]
for i in files_destino:
                print i
                subprocess.call(["cp","-v", "%s" % i,"/tmp/"])

在shell中显示:

bash-3.2$ ./comodin.py ./espacio/
Boxx view.pdf
cp: Boxx view.pdf: No such file or directory
hola.txt
hola.txt -> /tmp/hola.txt
bash-3.2$ 

【问题讨论】:

  • 为什么引号中有“空格”?
  • 对不起。在这里写问题:)
  • 您是指包含 U+0020 字符的文件吗?为什么这很重要?
  • 在一个文件夹内有一系列文件,例如"用户手册_v1.pdf","用户手册_v2.pdf" .需要拉他们的md5。因此,当行“....for filename in (file for file in os.listdir(archivo)):....”采用“user”和“manual_v1.pdf”、“user”、“manual_v2.pdf”时当仅存在 2 个文件时,作为四个不同的文件。我希望我解释得更好。
  • file 是预定义的文件类型对象,您可能希望将文件变量重命名为其他名称。阅读时会造成混乱。还有,os.listdir 输出的是一个列表,有什么理由再重复一遍吗?

标签: python for-loop logging md5 spaces


【解决方案1】:
def onepath(archivo):
    logging.basicConfig(filename=salida,filemode="w", format='%(message)s', level=logging.DEBUG)
    for filename in os.listdir(archivo):
        filepath = os.path.join(archivo, filename)
        with open(filepath) as checkfile:
            logging.info("MD5 " + "(%s) = " % filename + hashlib.md5(checkfile.read()).hexdigest())

【讨论】:

  • 感谢@Rain Lee,它提出了一个想法,但仍然有缺点。
  • 要复制文件,您应该使用 shutil.copy(src, dst) 而不是使用带有系统命令“cp”的子进程。类似地,src, dst 可以用 os.path.join(sys.argv[1], filename)
  • 我会工作的。但是“cp”这是一个示例,用于指出处理带有空格的文件名(因为 Unix 需要在空格前面带有斜杠的文件。目的是用“cp”代替“hashlib.md5(checkfile.read() ).hexdigest())" 来拉取 MD5。
  • 为什么要将纯python代码与系统工具混合使用?如果您喜欢使用“md5sum”或“cp”等系统命令来执行此操作,您可以执行以下操作: ls | xargs -I{} md5sum "{}"
  • 使用 GUI 程序可能会变得如此简单甚至更好。但是为什么不尝试在 python 中学习呢?
最近更新 更多