【问题标题】:how do I write lines to a NamedTemporaryFile then print each line如何将行写入 NamedTemporaryFile 然后打印每一行
【发布时间】:2021-10-01 11:05:27
【问题描述】:

我正在尝试解压缩包含 csv 文件的 zip 文件,并将 csv 文件中的所有行写入 NamedTemporaryFile。然后打印临时文件中的行以确保它已正确写入所需的行。这是我当前的代码,当调用“print(line)”时返回一个空白。

with zipfile.ZipFile(file_name) as zip_fp:
        for item in zip_fp.namelist():
            temp_file = NamedTemporaryFile()
            with zip_fp.open(item) as fp:
                with open(temp_file.name, mode='wb+') as temp_fp:
                    temp_fp.writelines(fp.readlines())
                    for line in temp_fp:
                        print(line)

请帮忙。

【问题讨论】:

    标签: python zip temporary-files


    【解决方案1】:

    那是因为temp_fp.writelines(fp.readlines()) 已将所有行写入文件,并且光标现在位于文件末尾,因此您不会得到任何东西。试试下面的代码(最后 3 行添加到您的代码中):

    with zipfile.ZipFile(file_name) as zip_fp:
            for item in zip_fp.namelist():
                temp_file = NamedTemporaryFile()
                with zip_fp.open(item) as fp:
                    with open(temp_file.name, mode='wb+') as temp_fp:
                        temp_fp.writelines(fp.readlines())
                    with open(temp_file.name, mode='r') as temp_fp:
                        for line in temp_fp:
                            print (line)
                    
    

    或 - seek 到文件开头并读取所有行:

    with zipfile.ZipFile(file_name) as zip_fp:
            for item in zip_fp.namelist():
                temp_file = NamedTemporaryFile()
                with zip_fp.open(item) as fp:
                    with open(temp_file.name, mode='wb+') as temp_fp:
                        temp_fp.writelines(fp.readlines())
                        # SEEK TO START OF FILE
                        temp_fp.seek(0,0)
                        for line in temp_fp:
                            print (line)
                    
    

    【讨论】:

    • 这两个答案都会在不需要时保持 zipfile 打开。此外,冷杉是错误的,因为它以 write 模式打开文件,而不是读取
    • 哎呀,复制粘贴,无论如何更新了第二部分以读取模式打开文件
    • 没问题 :-) 很高兴我能帮上忙!
    【解决方案2】:

    原因是写入会寻找到文件的末尾,所以没有什么可读取的了。这段代码:

    with zip_fp.open(item) as fp:
         with open(temp_file.name, mode='wb+') as temp_fp:
             temp_fp.writelines(fp.readlines())
                 for line in temp_fp:
                     print(line)
    

    执行以下操作:

    • 以 fp 格式打开 zip:
    • 以 temp_fp 形式打开临时文件
    • 从 temp_fp 的开头写入(因为我们未处于附加模式)。
    • 在文件结束后读取任何内容(即什么都没有)。

    没有理由检查写作是否有效:它会。但是,如果您想这样做,可以使用以下方法:

    with zip_fp.open(item) as fp, temp_file.open("wb+") as tmpf:
        for line in fp:
            tmpf.writelines([line])
    with tmp_file.open("rb") as tmpf:
        for line in tmpf:
            print(line)
    

    请注意这里的一些修正——自始至终使用路径对象,一行中的多个 withs,并通过直接写入来避免内存浪费。

    顺便说一下,这些应该是二进制模式吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 2020-05-20
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多