метод read возвращает пустую строку

Код должен перебирать файлы из ключей словаря и если файл непустой, то содержимое файла должно становится значением ключа, но вместо содержимого почему-то устанавливается пустая строка.

Код:

files = {"logs_2.txt":None, "logs_3.txt":None, "logs_4.txt":None}
for file in files:
    f = open(file, "r")
    if len(f.read()):
        files[file] = f.read()
    f.close()
print(files)

Файл logs_4.txt:

1,2,3,4,5,6,7,8,9,10

Stdout после print(files):

{'logs_2.txt': None, 'logs_3.txt': None, 'logs_4.txt': ''}

Ответы (1 шт):

Автор решения: Xander

Дело в том, что когда вы делаете read, то после чтения из файла питон запоминает, на каком месте файла он остановился, и следующий read будет с этого же места.

Но это имеет хоть какой-то смысл, только когда вы читаете файл частично.

Если же вы используете read() без указания, сколько именно надо читать, то файл вычитывается полностью, и для следующего read ничего не остаётся.

В len(f.read()) уже целиком вычитали файл, и следующий read ничего нового уже не прочитает.

Надо так:

files = {"logs_2.txt":None, "logs_3.txt":None, "logs_4.txt":None}
for file in files:
    f = open(file, "r")
    data = f.read()          # Делаем read только один раз
    if len(data):            # А потом используем сохранённое значение
        files[file] = data   # сколько угодно раз
    f.close()
print(files)
→ Ссылка