python中的文件名技巧

时间:2011-09-19 17:17:37

标签: python

我有一个包含各种格式书籍的文件夹(.pdf,.djvu,.dvi)。它们都遵循以下格式:

[书名] - [作者]。[表示可否搜索的标识符]。[filetype]

我想列出我的书籍格式(x,y,z,t),其中x是书的名字,y是作者等等。我的问题是当我这样做时:

for file in os.listdir('/home/username/Books'):

文件是一个字符串,因此是不可变的,所以我无法改变它。

5 个答案:

答案 0 :(得分:3)

字符串是不可变的,但这并不意味着你无法从字符串中创建所需的元组。

这样的事情应该有效:

def file_to_tuple(file):
    title_author, searchable, ext = file.rsplit('.', 2)
    title, author = title_author.rsplit(' - ', 1)
    return (title, author, searchable, ext)

然后,您可以通过多种方式将文件列表转换为元组列表,这里有几个选项:

book_list = map(file_to_tuple, os.listdir('/home/username/Books'))

book_list = [file_to_tuple(f) for f in os.listdir('/home/username/Books')]
使用带有maxsplit参数的

str.rsplit(),以便包含句点或短划线的标题或包含句点的作者不会失败,例如:

>>> file_to_tuple('Narnia - The Silver Chair - C.S. Lewis.1.pdf')
('Narnia - The Silver Chair', 'C.S. Lewis', '1', 'pdf')

答案 1 :(得分:2)

使用string.split将其分解为所需的部分。

答案 2 :(得分:2)

您不想更改字符串,因此它是不可变的这一事实是无关紧要的。您仍然可以从中制作新商品。

这是一个小功能(测试,甚至;),它可以做你想要的:

def book_tuple(info):
    book_author, searchable, ext = info.rsplit('.', 2)
    book, author = book_author.rsplit(' - ', 1)
    return book, author, searchable, ext

book_list = []
for filename in os.listdir('/home/username/Books'):
    book_list.append(book_tuple(filename))

第一次拆分使用.rsplit()2,以便最多拆分两次(如果标题或作者姓名中有句点)并从结尾开始(再次,如果有的话)是标题或作者姓名中的句号)。第二次拆分也是如此,最大拆分为1(原因相同)。

答案 3 :(得分:1)

这不是问题,因为你不想改变它。你想把它的一部分提取成新的字符串。

一种简单的方法可能是这样的:

top = file.split(" - ")
name = top[0]
fields = top[1].split(".")
author = fields[0]
searchable = fields[1]
filetype = fields[2]

my_books.append((name, author, searchable, filetype)

这只是在my_books中建立一个平面列表,但你当然可以做一些更聪明的事情。

答案 4 :(得分:1)

  

文件是一个字符串,因此是不可变的,所以我无法改变它。

所以?你想改变什么?

您希望将其解析为不同标点符号的片段。

您想要从现有字符串创建新字符串。没有什么“改变”。

您有split()partition(),这两项工作都将完成您的工作。

字符串的不变性完全无关紧要。