RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 649559
Accepted
Пётр Колтаков
Пётр Колтаков
Asked:2020-04-07 15:36:21 +0000 UTC2020-04-07 15:36:21 +0000 UTC 2020-04-07 15:36:21 +0000 UTC

将多维数值数组写入文件,然后分段读取

  • 772

你好!请告诉我如何将多维列表写入文件,然后分段读取。同时,需要接收一个数组,而不是文本行。让我用一个与我的任务类似的例子来解释。有一个清单:

a = []
a.append([1,2,3,4,5])
a.append([11,12,13,14,15])
a.append([21,22,23,24,25]) # Таких строчек будет 30000

b = [10,20,30,40,50]

c = (a,b) # Таких строчек будет 1000000

print(c) # Здесь print(), а нужна запись в файл.
$([[1, 2, 3, 4, 5], [11, 12, 13, 14, 15], [21, 22, 23, 24, 25]], [10, 20, 30, 40, 50])

在一个循环中(for i in (1000000):) 写下这样的 kartezh(或数组 - 不是本质上),作为文件中的“with”是可取的。然后您需要从该文件中读取具有所需编号的行。同时,准确获取带有数字的列表非常重要,然后将其作为列表处理。例如:

z = файл[номер строчки из файла = с[i]] [0] # Получаем объект типа list
h = файл[номер строчки из файла = с[i]] [1] # Получаем объект типа list

如何在性能损失最小的情况下做到这一点?

python
  • 4 4 个回答
  • 10 Views

4 个回答

  • Voted
  1. Best Answer
    vadim vaduxa
    2020-04-08T04:53:19Z2020-04-08T04:53:19Z

    1) 从文件中读取数据是一项耗时的操作,因此最好将所有内容读入变量并使用它。

    2)如果数据量不允许将它们保存在内存中,那么将所有数据放在一个文件中也是一个坏主意。比如读取一个文件的第100行,必须先读取前面的99行。那些,每次访问文件时,将读取“额外”信息(索引较低的行)

    3)为了避免不必要的读取(如p2)和不将数据保存在内存中(如p1)
    ,例如数据可以放在不同的文件中,而不是一个文件的不同行。为此,使用pickle + 类DataFile,它提供读取和写入具有特定索引的文件的功能。为了使用运算符访问数据文件[],您需要定义方法 __setitem__ __getitem__

    import pickle
    
    class DataFile:
        def __setitem__(self, index: int, value):
            '''сохранить в файл index.data'''
            with open('{}.data'.format(index), 'wb') as f:
                pickle.dump(value, f)
    
        def __getitem__(self, index: int):
            '''читать из файла index.data'''
            with open('{}.data'.format(index), 'rb') as f:
                return pickle.load(f)
    
    if __name__ == '__main__':
        file = DataFile()
        # записать в файл file[индекс] - индекс.data
        file[0] = [[2, 1, 3, 4, 5], [11, 12, 13, 14, 15], [21, 22, 23, 24, 25]]
        file[1] = 10
        file[2] = {'123': [-1, -2, [-3]]}
        # читать из file[индекс] - индекс.data
        d1 = file[0][1][-1]  # 15
        d2 = file[1]  # 10
        d3 = file[2]['123'][2]  # [-3]
        print(d1, d2, d3)
    
    • 1
  2. user243273
    2020-04-07T17:43:25Z2020-04-07T17:43:25Z

    下午好。您可以通过提供包含以下行的列表来解决您的问题:

    temp_lst = [1,2,3,4,5]
    global_lst = []
    
    for i in range(4):
        global_lst.append(temp_lst)
    
    f = open('test.txt', 'a') #аттрибут a - будет открывать файл на дозапись, w - на перезапись
    f.write(str(global_lst))
    f.close()
    

    使用 repr() 函数也可以:

    f.write(repr(global_lst))
    

    要使用文件,您需要打开它们。如果文件不存在,将创建它(仅当文件未打开以供读取时)。您可以通过两种方式执行此操作:

    f = open('filename.txt', 'attr') # где attr - формат работы с файлом (r, w, a, r+, w+, rb, wb)
    

    这种处理文件的格式不会自动关闭它,因此在处理完它后,您需要关闭它:

    f.close()
    

    这种工作格式会自动关闭文件并允许您一次打开多个文件:

    with open('file1.txt', 'r') as f1, open('file1.txt', 'a') as f2:
        data = f1.read()
        f2.write(data)
    
    try:
        f1.read()
    except:
        print('file closed')
    

    当然,以后再编入索引是不可能的。而且,一般来说,最好使用像 pandas 这样的专门库和像 csv 或 json 这样的数据格式来处理数据。但如果你真的想使用基本工具,那么我可以提供这个录制选项:

    f = open('test.txt', 'a') #аттрибут a - будет открывать файл на дозапись, w - на перезапись
    for x in range(len(global_lst)):
        for j in range(len(global_lst[x])):
            f.write(str(global_lst[x][j]) + ' ' + str(x) + ' ' + str(j) + '\n')
    f.close()
    

    因此,在每一行我们写:

    число первый_индекс второй_индекс
    

    然后,将行输入作为输入,我们可以通过对它们应用 split(' ') 函数并从每一行获取以下形式的数组来恢复原始数组:

    [число, первый индекс, второй индекс]
    

    好吧,接下来就看小事了:正确组装数组,引用每一行数组的元素。

    • 0
  3. Пётр Колтаков
    2020-04-07T20:34:05Z2020-04-07T20:34:05Z
    # Записываем файл
    outputfile = "./DATA/test_file.txt"
    myfile = open(outputfile, mode='w', encoding='latin_1')
    myfile.write(repr(c)) # repr()
    myfile.write("\n")
    myfile.write(repr(c)) # repr()
    myfile.write("\n")
    myfile.close()
    
    # Читаем из него
    myfile = open(outputfile, mode='r', encoding='latin_1')
    a1=[]
    a2=[]
    for line in myfile:
        g = eval(line) # eval() - очень крутая штука :)
        a1.append(g[0])
        a2.append(g[1])
    print(a1)
    $[[[1, 2, 3, 4, 5], [11, 12, 13, 14, 15], [21, 22, 23, 24, 25]], [[1, 2, 3, 4, 5], [11, 12, 13, 14, 15], [21, 22, 23, 24, 25]]]
    print(a2)
    $[[10, 20, 30, 40, 50], [10, 20, 30, 40, 50]]
    

    如果不是因为读取文件的问题,一切都会好起来的。我正在绞尽脑汁研究如何不连续读出所有行,而是只读出正确的数字。那些。您需要键入一个包含特定数字的新行数组。台词不顺……那我还想什么呢。问题仍然没有完全解决:(

    • 0
  4. user243273
    2020-04-07T22:42:25Z2020-04-07T22:42:25Z

    评论里,代码看起来不太好,所以我会写在答案里。

    这里我们创建一个多维数组:

    temp_lst = [1,2,3,4,5]
    temp_lst2 = []
    global_lst = []
    
    for i in range(4):
        temp_lst2.append(temp_lst)
    
    for i in range(4):
        global_lst.append(temp_lst2)
    

    这里我们将它写入一个文件:

    f = open('test.txt', 'w')
    f.write(str(global_lst) + '\n')
    f.close()
    

    这里我们从文件中读取一个多维数组并输出一些值:

    f = open('test.txt', 'r')
    lst = eval(f.readlines()[0]) # задаём переменной lst первую строку из файла 'test.txt'
    print(lst[0]) #[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]
    print(lst[0][0]) # [1, 2, 3, 4, 5]
    print(lst[0][0][2]) # 3
    

    PS 了解索引

    更新程序

    最后更新和最后回复。如果文件包含需要组装成多维数组的数组,可以这样做:

    global_lst = []
    
    file = open('filename.txt', 'r')
    lines = file.readlines()
    
    for line in lines:
        lst = eval(line) # берём строчку и преобразуем её в массив
        global_lst.append(lst) # и добавляем этот массив в глобальный массив
    

    因此,您可以将任何一维数组转换为一维数组(这对每个人和未来都是如此):

    temp_value = global_lst[0]
    
    while type(temp_value) == list:
        global_lst = [item for sublists in global_lst for item in sublists]
        temp_value = global_lst[0]
    
    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5