2011-09-19 9 views
0

다양한 형식 (.pdf, .djvu, .dvi)의 내 책이 들어있는 폴더가 있습니다. 그들은 모두 형식에 따라 :..파일 이름이 파이썬으로 트릭

[책의 이름] - [저자] [파일 형식]

내 도서 목록을 만들고 싶어 [가 검색 아닌지 식별자를 나타내는] 그 따라서,

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

파일이 문자열 : x는 책의 이름입니다 형식 (X, Y, Z, t)이며, y는 저자는 내 문제는 내가 할 때이다 등이다 불변하므로 변경할 수 없습니다.

답변

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 PARAM와

str.rsplit() 이 사용됩니다

>>> 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

@multipleinterfaces : 파싱은 거의 항상 파싱되는 것에 대한 가정을 필요로하며 여기에 가정하는 것은 합리적입니다. – 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)) 

첫 번째 분할 그래서의 기간이있다는 최대 2 시간에 (경우에 분할하는 것이 2.rsplit() 사용 : 당신이 원하는 것을 그 (심지어 테스트) 여기

작은 함수의 제목 또는 저자 이름)을 입력하고 마지막부터 다시 시작합니다 (제목이나 저자 이름에 마침표가있는 경우 다시 말). 두 번째 분할은 동일한 작업을 수행하며 최대 분할 값은 1입니다 (동일한 이유로).