我有一個包含各種格式(.pdf,.djvu,.dvi)的圖書的文件夾。他們都遵循以下格式:。python中的文件名技巧
[圖書名稱] - [作者簡介] [標識指示如果搜索與否] [文件]
我要讓我的書單,是格式(X,Y,Z,T),其中x是這本書的名字,y是筆者等我的問題是,當我這樣做:
for file in os.listdir('/home/username/Books'):
文件是一個字符串,從而不可變的,所以我不能改變它。
我有一個包含各種格式(.pdf,.djvu,.dvi)的圖書的文件夾。他們都遵循以下格式:。python中的文件名技巧
[圖書名稱] - [作者簡介] [標識指示如果搜索與否] [文件]
我要讓我的書單,是格式(X,Y,Z,T),其中x是這本書的名字,y是筆者等我的問題是,當我這樣做:
for file in os.listdir('/home/username/Books'):
文件是一個字符串,從而不可變的,所以我不能改變它。
字符串是不可改變的,但是,這並不意味着你不能創建你從字符串需要的元組。
像這樣的東西應該工作:
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')]
str.rsplit()
使用參數maxsplit
可以使其不會因包含句號或破折號的作者或包含句點的作者而失敗,例如:
>>> file_to_tuple('Narnia - The Silver Chair - C.S. Lewis.1.pdf')
('Narnia - The Silver Chair', 'C.S. Lewis', '1', 'pdf')
使用string.split
打入所需零件這一點。
這不是問題,因爲你不想改變它。你想把它的部分提取成新的字符串。
一個簡單的方法可能是這樣的:
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
平坦的列表,當然你可以做一些更聰明。
文件是一個字符串,從而不變的,所以我不能改變它。
所以呢?你想改變什麼?
你想把它解析成不同的標點符號。
您想從現有的字符串中創建新的字符串。沒有什麼變化」。
你有split()
和partition()
,兩者都將獲得多少你的工作完成的。
字符串的不變性完全不相關。
你不想改變字符串,所以它是不可改變的事實是不重要的。您仍然可以從中製作新的項目。
這裏的一個小功能(經測試,即使;),你想要做什麼:
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
,使其分裂最多爲2次(如果有在時段標題或作者姓名)並從結尾開始(同樣,如果標題或作者姓名中有句點)。第二次拆分也是一樣的,最大拆分爲1(出於同樣的原因)。
如果Title屬性包含「 - 」,則將失敗。 – multipleinterfaces
@多重接口:解析幾乎總是需要關於什麼被解析的假設,並且這裏所做的假設是合理的。 – tom10
@ tom10:我不同意 - 破折號在標題和名稱中都很常見。他們需要考慮。 –