2016-04-12 6 views
1

Это мой код, зажатой с этого сайта:Поместите имена файлов .txt в список

import os 
for file in os.listdir("C:\\"): 
    if file.endswith(".txt"): 
     file = file.strip(".txt") 
     print(file) 

Он отлично работает, но я хочу, чтобы иметь возможность манипулировать мои результаты и хранить их в список, и я не уверен, как это сделать. Это, наверное, просто супер, и я полностью потерял меня, я вроде как нуб. Спасибо :)

EDIT:

Я удалил readlines часть, которая не должна была быть там. То, что я пытаюсь сделать, это получить имена каждого текстового файла в папке, в этом случае папка является C: \

+0

«Манипулировать моими результатами» вы подразумеваете 'readlines()' или 'файл'? – Ian

+0

'os.listdir (" C: \\ ")' уже возвращает список всех файлов в этом каталоге –

+2

И я не думаю, что этот код должен работать ... 'file.readlines()' должна ошибка с ' AttributeError: объект 'str' не имеет атрибута 'readlines'' –

ответ

1

Возможно, вы хотите иметь что-то вроде этого:

import os 
allfiles = os.listdir('C:\\') 
onlytxt = [x for x in allfiles if x.endswith('.txt')] 
print onlytxt 

если вы не хотите иметь .txt в списке это сделать:

onlytxt = [x[:-4] for x in allfiles if x.endswith('.txt')] 
+0

Brilliant. Точно то, что мне нужно, без суеты. Спасибо :) – Benjimaestro

2

пару альтернатив incBrain (в прекрасно) answer.

Во-первых, упростить свой код вместо того, чтобы изобретать колесо, используйте glob.glob:

import glob 

onlytxt = [file[:-4] for file in glob.glob('C:\\*.txt')] 

Или получить более высокую производительность на Python 3.5+ (или любой версии Python, используя scandir модуль из PyPI):

import os # Pre-3.5, you'd import and use the scandir module from PyPI 

# Use file.path[:-4] to store the full path (sans .txt extension) 
# where file.name[:-4] only gets the file name without the path or extension 
onlytxt = [file.name[:-4] for file in os.scandir('C:\\') if file.name.endswith('.txt')] 

Или для истинного нелепости, нажмите больше работы на уровне C и избежать избыточности путем отщепления расширения один раз, вместо одного чека на него, а затем еще одну операцию, чтобы лишить его:

import os 
from operator import attrgetter 

components = map(os.path.splitext, map(attrgetter('name'), os.scandir('C:\\'))) 
onlytxt = [root for root, ext in components if ext == 'txt'] 

os.scandir не делает много для вас в этом случае (вы не читаете никаких атрибутов может быть проверены для вас), но в великоватом каталоге, это означает, что вы не хранить все записи сразу (os.listdir и большинство других API-интерфейсов сначала прочитают полное содержимое каталога в list, прежде чем у вас есть возможность его фильтровать), поэтому максимальное использование памяти уменьшается, когда сопоставляется несколько файлов.

Смежные вопросы