2011-09-19 75 views
0

我有一個包含各種格式(.pdf,.djvu,.dvi)的圖書的文件夾。他們都遵循以下格式:。python中的文件名技巧

[圖書名稱] - [作者簡介] [標識指示如果搜索與否] [文件]

我要讓我的書單,是格式(X,Y,Z,T),其中x是這本書的名字,y是筆者等我的問題是,當我這樣做:

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

文件是一個字符串,從而不可變的,所以我不能改變它。

回答

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')] 

str.rsplit()使用參數maxsplit可以使其不會因包含句號或破折號的作者或包含句點的作者而失敗,例如:

>>> file_to_tuple('Narnia - The Silver Chair - C.S. Lewis.1.pdf') 
('Narnia - The Silver Chair', 'C.S. Lewis', '1', 'pdf') 
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平坦的列表,當然你可以做一些更聰明。

+0

如果Title屬性包含「 - 」,則將失敗。 – multipleinterfaces

+0

@多重接口:解析幾乎總是需要關於什麼被解析的假設,並且這裏所做的假設是合理的。 – tom10

+0

@ tom10:我不同意 - 破折號在標題和名稱中都很常見。他們需要考慮。 –

1

文件是一個字符串,從而不變的,所以我不能改變它。

所以呢?你想改變什麼?

你想把它解析成不同的標點符號。

您想從現有的字符串中創建新的字符串。沒有什麼變化」。

你有split()partition(),兩者都將獲得多少你的工作完成的。

字符串的不變性完全不相關。

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,使其分裂最多爲2次(如果有在時段標題或作者姓名)並從結尾開始(同樣,如果標題或作者姓名中有句點)。第二次拆分也是一樣的,最大拆分爲1(出於同樣的原因)。