我有一个包含各种格式书籍的文件夹(.pdf,.djvu,.dvi)。它们都遵循以下格式:
[书名] - [作者]。[表示可否搜索的标识符]。[filetype]
我想列出我的书籍格式(x,y,z,t),其中x是书的名字,y是作者等等。我的问题是当我这样做时:
for file in os.listdir('/home/username/Books'):
文件是一个字符串,因此是不可变的,所以我无法改变它。
答案 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()
,这两项工作都将完成您的工作。
字符串的不变性完全无关紧要。