2013-06-20 77 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] 

您还可以使用在2.x的3.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,所以这是一个显而易见的方法是什么?它取决于...对于简短版本:如果您需要在2.6之前使用Python版本,请使用codecs;如果没有,请使用io

+0

我喜欢咸菜库,这是非常甜蜜的,完美的作品。我已经实现了它,它似乎工作正常。 谢谢,只要它允许,我会立即将您标记为绿色勾号。 – Ryflex

+0

unicode-escape ...由于TypeError,我必须打开它为'wb':必须是str,而不是字节 – rluks

+0

@Pan.student:您使用的是Python 3.x,对不对?在Python 2中,这是这个问题提出的问题,'str'和'bytes'是相同的类型,二进制文件和文本文件之间的区别仅仅是换行。在Python 3中,'str'和'unicode'是相同的类型,二进制文件和文本文件的区别在于文本文件会自动为您编码和解码。 (如果你小心的话,如果是2.x,你可以得到类似3.x的行为,包括带有'io.open'的3.x-style文本文件,但提问者没有这样做。) – abarnert

12

只要你的文件有一致的格式(即换行符),这很容易,只需基本的文件IO和字符串操作:

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