2013-06-20 3 views
32

Это немного странный запрос, но я ищу способ записать список в файл, а затем прочитать его в другой раз.Python 2.7 - Напишите и прочитайте список из файла

У меня нет возможности переделать списки, чтобы они были правильно сформированы/отформатированы, как показано в примере ниже.

Мои списки имеют данные, такие как следующие:

test 
data 
here 
this 
is one 
group :) 

test 
data 
here 
this 
is another 
group :) 

ответ

92

Если вам не нужно быть человеком считываемые/редактируемые, самым простым решением является просто использовать pickle.

Чтобы написать:

with open(the_filename, 'wb') as f: 
    pickle.dump(my_list, f) 

Для чтения:

with open(the_filename, 'rb') as f: 
    my_list = pickle.load(f) 

Если вы сделать нужно, чтобы они были читаемый человеком, нам нужно больше информации.

Если my_list гарантированно будет список строк без каких-либо внедренных новых строк, просто напишите их по одному в строке:

with open(the_filename, 'w') as f: 
    for s in my_list: 
     f.write(s + '\n') 

with open(the_filename, 'r') as f: 
    my_list = [line.rstrip('\n') for line in f] 

Если они Unicode строк, а не байт строки, вы будете хотят encode им. (Или, что еще хуже, если они байтовые строки, но не обязательно в той же кодировке, что и ваша система по умолчанию.)

Если у них могут быть символы новой строки или непечатаемые символы и т. Д., Вы можете использовать экранирование или цитирование , Python имеет множество различных видов экранирования, встроенных в stdlib.

Давайте использовать unicode-escape здесь, чтобы решить обе вышеуказанные проблемы сразу:

with open(the_filename, 'w') as f: 
    for s in my_list: 
     f.write((s + u'\n').encode('unicode-escape')) 

with open(the_filename, 'r') as f: 
    my_list = [line.decode('unicode-escape').rstrip(u'\n') for line in f] 

Вы также можете использовать решение 3.x стиле в 2.x, либо с codecs модуля или io модуль: *

import io 

with io.open(the_filename, 'w', encoding='unicode-escape') as f: 
    f.writelines(line + u'\n' for line in my_list) 

with open(the_filename, 'r') as f: 
    my_list = [line.rstrip(u'\n') for line in f] 

* TOOWTDI, так что является очевидным способом? Это зависит ... Для короткой версии: если вам нужно работать с версиями Python до версии 2.6, используйте codecs; если нет, используйте io.

+0

Мне нравится библиотека рассола, это очень мило и прекрасно работает.Я уже реализовал его, и, похоже, он работает нормально. Спасибо, я помечаю вас как зеленый галочку, как только это позволит мне. – Ryflex

+0

unicode-escape ... Мне пришлось открыть его как «wb» из-за TypeError: должен быть str, а не байтами – rluks

+0

@ Pan.student: вы используете Python 3.x, правильно? В Python 2, о чем спрашивал этот вопрос, 'str' и' bytes' относятся к одному типу, а разница между двоичными файлами и текстовыми файлами - это просто перевод новой строки. В Python 3, 'str' и' unicode' являются одним и тем же типом, а разница между двоичными файлами и текстовыми файлами заключается в том, что текстовые файлы автоматически кодируются и декодируются для вас. (Вы можете получить 3.x-подобное поведение, если 2.x, если вы будете осторожны, включая текстовые файлы в стиле 3.x с 'io.open', но об этом не спрашивал.) – abarnert

12

Пока ваш файл имеет последовательное форматирование (т.е. разрывы строк), это легко только с основной файл ввода-вывода и операций со строками:

with open('my_file.txt', 'rU') as in_file: 
    data = in_file.read().split('\n') 

Это будет хранить файл данных в виде списка элементов , по одной на линию. Для того, чтобы затем поместить его в файл, вы могли бы сделать наоборот:

with open('new_file.txt', 'w') as out_file: 
    out_file.write('\n'.join(data)) # This will create a string with all of the items in data separated by new-line characters 

Хотелось бы надеяться, что соответствует то, что вы ищете.

+0

+1. Если «данные», о которых мы говорим, не являются сложными, ИМХО, лучше катить свой собственный парсер, как в этом. – brokenfoot

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