【问题标题】:Renaming files with quotation marks in the title using Python使用Python重命名标题中带引号的文件
【发布时间】:2019-03-15 15:41:16
【问题描述】:

我知道在这个网站上曾多次询问过类似的问题,但那里提供的解决方案对我不起作用。

我需要重命名带有诸如

等标题的文件
a.jpg
'b.jpg'
c.jpg
"d.jpg"

a.jpg
b.jpg
c.jpg
d.jpg

其中一些标题在标题内也有引号,但它们是否被删除并不重要。

我试过了

import os
import re

fnames = os.listdir('.')
for fname in fnames:
   os.rename(fname, re.sub("\'", '', fname))

import os
for file in os.listdir("."):
  os.rename(file, file.replace("\'", "")) 

然后对 " 引号也做同样的事情,但标题保持不变。我认为这可能是由于 listdir 返回带有 ' 引号的文件名,但我不确定。

编辑:我正在使用 Ubuntu 18.04。

【问题讨论】:

  • 你的操作系统是什么?
  • 它在windows上工作,当前目录是什么?你能打印你想重命名的文件吗?
  • 我正在使用 Ubuntu 服务器。没有安装重命名,我也没有安装它的权限,所以我选择了 Python。我刚刚尝试打印新文件名,它们似乎已正确更正,但文件名保持不变。
  • 在 Ubuntu 18.04 桌面和 Python 3.7 上工作。你的意思是正确纠正但保持不变?
  • 我的意思是,如果我打印更改的文件名,那么引号会被正确删除,但如果我检查目录,它们仍然没有改变。

标签: python string filenames


【解决方案1】:

在 Windows 上,带有双引号的文件名不是有效的文件名。但是,带单引号的文件名是有效的。

在python中带有双引号的字符串看起来像:

'"I\'m a string with a double quote on each side"'

python 中带有单引号的字符串如下所示:

"'I\'m a string with a single quote on each side'"

因为您不能在 Windows 上使用双引号文件名,所以您不能 os.rename('"example.txt"', "example.txt")。因为它甚至不能被重命名。

您可以将此脚本放在您的桌面上,并在执行时观察文件名的变化:

import os

open("'ex'am'ple.t'xt'",'w')
input("Press enter to rename.")
#example with single quotes all over the filename
os.rename("'ex'am'ple.t'xt'", "example.txt")

open("'example.txt'",'w')
input("Press enter to rename.")
#example with single quotes on each side of filename
os.rename("'example2.txt'", "example2.txt")

【讨论】:

  • 我正在开发 ubuntu 18.04,应该在帖子中澄清这一点,抱歉。
  • @Shikah 如果带双引号的文件名在 Ubuntu 中有效,那么 os.rename('"example.txt"', "example.txt") 应该可以工作。
【解决方案2】:

这是我使用 for 循环的尝试,就像你做的那样,并在字符串上使用列表理解,这也是一个可迭代的。

import os

files = os.listdir(os.getcwd())
for file in files:
    new_name = ''.join([char for char in file if not char == '\''])
    print(new_name)
    os.rename(file, new_name)

使用您不希望在将来的文件名中出现的字符编辑forbidden_​​chars 列表。 请记住,这也会更改文件夹名称 afaik,因此您可能需要在 for 循环的开头进行检查 如果 os.isfile(文件): 在更改名称之前。 我实际上不明白您将如何拥有包含引号内的扩展名的文件名,但这应该可以工作。如果你想去除圆点,我强烈建议小心。 我还建议在使用它的功能之前先查看 os 模块的文档,因为它们可以做你可能不知道的事情。例如:重命名为目录中现有的文件名只会默默地替换文件。

【讨论】:

  • 我收到“TypeError: rename: dst should be string, bytes or os.PathLike, not list”这个解决方案。
  • 我认为 files 中的文件不是字符串,因此列表理解不会创建新字符串。将 file = str(file) 添加到 for 循环的顶部是否可以解决您的问题?
  • 在列表中使用str.join
  • 行得通!我应该正确测试我的代码。那是我的错。我更新了代码示例。我删除了禁用字符列表,但我相信你现在可以自己做。
猜你喜欢
  • 2022-06-22
  • 2017-05-23
  • 2013-08-24
  • 1970-01-01
  • 2016-01-01
  • 2014-10-10
  • 2011-05-10
  • 2018-12-26
相关资源
最近更新 更多