Reads Path> File as String - "AttributeError: объект" str "не имеет атрибута" open "" Почему?

В приведенном ниже коде читается out_file как строка, и я не могу понять, почему. Если я не рассматриваю его как строку, то он говорит, что расположение файла неверно. По-видимому, он читает штраф src_dir. Заранее благодарю за любую помощь. Я очень новичок в питоне и преподаю сам.

import os
import os.path
import shutil

'''This is supposed to read through all the text files in a folder and
copy the text inside to a master file.'''

# This gets the source and target directories for reading writing the
# files respectively

src_dir = r'E:\filepath\text_files'
out_file = r'E:\filepath\master.txt'
files = (os.listdir(src_dir))
def valid_path(dir_path, filename):
 full_path = os.path.join(dir_path, filename)
 return os.path.isfile(full_path)
file_list = [os.path.join(src_dir, f) for f in files if valid_path(src_dir, f)] 


# This should open the directory and make a string of all the files
# listed in the directory. I need it to open them one by one, write to the
# master file and close it when completely finished.


open(out_file, 'a+')
with out_file.open() as outfile:
 for element in file_list:
 open(element)
 outfile.append(element.readlines())

out_file.close()

print 'Finished'
1 ответ

Это все неправильно:

open(out_file, 'a+')
with out_file.open() as outfile:
 for element in file_list:
 open(element)
 outfile.append(element.readlines())

out_file.close()

Правильное использование open, read, write, readlines является:

f = open(path_to_file, ...)
f.write(data)
data = f.read()
lines = f.readlines()
f.close()

[выше это не действительный или рабочий скрипт, просто пример того, как вызывать каждый метод]

Поэтому, чтобы помочь вам в вашем конкретном случае использования:

with open(out_file, 'a+') as outfile:
 for element in file_list:
 with open(element) as infile:
 outfile.write(infile.read())
  1. Вам не нужно close(), если вы используете with близко (что все точки with: она закрывает для вас).

  2. Поскольку вы хотите читать все из одного файла и писать другому, используйте read() а не readlines(): т.е. Получите всю партию, напишите всю партию.

Если вы действительно хотите использовать readlines(), то что-то вроде этого было бы лучше:

outfile.write(''.join(infile.readlines())

licensed under cc by-sa 3.0 with attribution.