如何在 Python 中写入临时文件并再次读取?

Kur*_*eek 2 python csv temporary-files

我正在尝试为将数据写入 CSV 文件的函数编写单元测试。为此,我想使用tempfile.NamedTemporaryFile写入命名的临时文件并再次打开它,我从文档中了解到这在 Unix 平台上应该是可能的。

但是,如果我尝试这个测试,

import csv
import tempfile


def write_csv(csvfile):
    writer = csv.DictWriter(csvfile, fieldnames=['foo', 'bar'])

    writer.writeheader()
    writer.writerow({'foo': 1, 'bar': 2})


def test_write_csv():
    with tempfile.NamedTemporaryFile(mode='w') as csvfile:
        write_csv(csvfile)

    with open(csvfile.name) as csvfile:
        reader = csv.DictReader(csvfile)
Run Code Online (Sandbox Code Playgroud)

我得到一个FileNotFoundError

> pytest csvtest.py -s
======================================= test session starts ========================================
platform darwin -- Python 3.7.3, pytest-5.0.1, py-1.8.0, pluggy-0.12.0
rootdir: /Users/kurtpeek/Documents/Scratch
collected 1 item                                                                                   

csvtest.py F

============================================= FAILURES =============================================
__________________________________________ test_write_csv __________________________________________

    def test_write_csv():
        with tempfile.NamedTemporaryFile(mode='w') as csvfile:
            write_csv(csvfile)

>       with open(csvfile.name) as csvfile:
E       FileNotFoundError: [Errno 2] No such file or directory: '/var/folders/fr/7gjx_3js67xg0pjxz6sptktc0000gn/T/tmpgml8_fwf'

csvtest.py:16: FileNotFoundError
===================================== 1 failed in 0.03 seconds =====================================
Run Code Online (Sandbox Code Playgroud)

我尝试了各种替代方法,例如尝试在写入时在同一个with块中打开文件(在这种情况下,我收到一个错误,提示它无法打开读取),以'rw'模式打开(在这种情况下csv不允许我写信给它)。

如何将 CSV 写入临时文件并在单元测试中再次读取?

jde*_*esa 6

如果要在关闭后保留临时文件,则需要通过delete=False. 从tempfile.NamedTemporaryFile您链接的文档中:

如果delete为 true(默认值),则在关闭文件后立即删除该文件。

然后你会这样做:

import csv
import tempfile

def write_csv(csvfile):
    writer = csv.DictWriter(csvfile, fieldnames=['foo', 'bar'])
    writer.writeheader()
    writer.writerow({'foo': 1, 'bar': 2})

def test_write_csv():
    with tempfile.NamedTemporaryFile(mode='w', delete=False) as csvfile:
        write_csv(csvfile)
    with open(csvfile.name) as csvfile:
        reader = csv.DictReader(csvfile)
Run Code Online (Sandbox Code Playgroud)