【问题标题】:How do I write a list of lists to a file in python?如何将列表列表写入python中的文件?
【发布时间】:2013-04-17 04:35:29
【问题描述】:

我的代码是这样的。我正在尝试将数字列表进行基数排序到列表列表中,然后将该列表列表写入文件,每个单独的列表位于不同的行。如果我尝试使用f.write,它会给我一个字符缓冲区预期错误。

from math import log

b = open("radix.in.txt").readlines()
a = [int(i) for i in b]

f = open("radix.out.txt", "w")
def getIndex(num, base, digit_num):
    return (num // base ** digit_num) % base  

def newLists(base):
    return [ [] for i in range(base) ]  

def order(q, base, digit_num):
    placehold = newLists(base)
    for num in a:
        placehold[getIndex(num, base, digit_num)].append(num)  
    return placehold

def radixSort(a, base):
    passes = 3
    new_list = a
    for digit_num in range(passes):
    new_list = order(new_list, base, digit_num)
    list_c = [str(i) for i in new_list]
    print list_c


radixSort(a, 10)

将 f.write(list_c) 放在打印 list_c 之后会给出此回溯

Traceback (most recent call last):
  File "C:\Users\Nolan Caldwell\Desktop\HW5.py", line 29, in <module>
    radixSort(a, 10)
  File "C:\Users\Nolan Caldwell\Desktop\HW5.py", line 26, in radixSort
    f.write(list_c)
TypeError: expected a character buffer object

【问题讨论】:

  • 你能发布完整的错误吗?

标签: python list


【解决方案1】:

list_c 是一个list-of-str。要将其转换为单个 str,请使用 str.join()

f.write('\n'.join(list_c)+'\n')

或者,如果您愿意,可以单独写每个str

for s in list_c:
  f.write(s+'\n')

【讨论】:

  • 这两个都只是创建一个空的文本文件。
  • @NolanCaldwell - 恕我直言,我不相信你。第一个不能生成一个空文本文件——它总是会打印至少一个空行。此外,当我测试这些时,它们会生成 10 行的输出文件,其内容取决于给定的输入。也许您添加的行没有被执行?
  • 我完全相信它应该可以工作。我很困惑为什么它没有。我在 print 语句之前添加了您提供给 radixSort 方法的代码,这肯定会执行它们,不是吗?对于您的两个代码示例,都会创建一个名为“radix.out.txt”的文本文件,但文件中没有任何内容(可能是空行)。
  • 有两种可能:您写入了错误的文件 foo.txt,认为您写入了 bar.txt(不太可能),或者您的列表为空(很可能)。这意味着list_c 是空的,因此new_list 是空的,这意味着order() 返回一个空列表。从那里调查您的代码。
【解决方案2】:

将其转换为字符串并在读取时使用 literal_eval 将其作为数组获取

f=open('file.txt','w')
a=[[1,2],[3,4],[4,5]]
b=str(a)
f.write(b)

当你阅读时,

import ast
f=open('file.txt','r')
a=f.read()
b=ast.literal_eval(a)

因为write() 函数只能处理字符串。或者将列表列表转换为字符串并使用 write。

【讨论】:

    【解决方案3】:

    听起来是使用csv 模块的好机会。

    import csv
    with open('numbers.csv', 'wb') as csvfile:
        writer = csv.writer(csvfile)
        for lst in list_of_lists:
            writer.writerow(lst)
    

    【讨论】:

      【解决方案4】:

      正如其他人所指出的,您需要以某种方式对数据进行序列化,然后才能将其写入文件。您可以腌制、json 编码、xml 编码、将其粘贴到 sqlite 之类的数据库中、逐行编写、放入 CSV 文件等......“最好”的方法(没有最好的)取决于什么您打算稍后处理该文件。人们需要阅读它吗?非python程序需要读吗?它是否大到足以担心它占用的空间量?

      如果你只是想保存一个整数列表并希望它在许多编程语言中都可读,我喜欢 json

      import json
      (... your other stuff here...)
      new_list = order(new_list, base, digit_num)
      json.dump(new_list, open('myfile.json', 'w'))
      

      【讨论】:

        猜你喜欢
        • 2017-12-21
        • 2014-06-27
        • 2020-04-20
        • 1970-01-01
        • 1970-01-01
        • 2015-05-29
        • 1970-01-01
        • 1970-01-01
        • 2013-11-03
        相关资源
        最近更新 更多