Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法从临时文件中读取内容_Python - Fatal编程技术网

Python 无法从临时文件中读取内容

Python 无法从临时文件中读取内容,python,Python,python:3.6.8 代码: 我无法从tempfile读取任何内容,但可以使用open作为另一个文件读取其内容: ipdb>temp_文件读取(10) b“ ipdb>临时文件.seek(0) 0 ipdb>临时文件读取(10) b“ ipdb>f=打开(temp_file.name) ipdb>f.read(10) “6C1D91DB-F” ipdb> 为什么会发生这种情况?您还没有发布足够的详细信息来重现此情况,但很可能是您的getui.download正在删除并重新创建文件,因此它将

python:3.6.8
代码:

我无法从
tempfile
读取任何内容,但可以使用open作为另一个文件读取其内容:

ipdb>temp_文件读取(10)
b“
ipdb>临时文件.seek(0)
0
ipdb>临时文件读取(10)
b“
ipdb>f=打开(temp_file.name)
ipdb>f.read(10)
“6C1D91DB-F”
ipdb>

为什么会发生这种情况?

您还没有发布足够的详细信息来重现此情况,但很可能是您的
getui.download
正在删除并重新创建文件,因此它将写入不同于Python打开的inode(不再有任何关联的目录条目)的inode。重新打开文件时,您现在看到的是
getui.download
编写的同一inode

为了通过示例演示可能发生的情况,下面是一个示例,其中(在Linux中)执行一些基本的文件操作来执行删除和重新创建(在执行此操作时使用ctrl-Z临时挂起Python进程):

>>temp\u file=tempfile.NamedTemporaryFile()
>>>temp_file.name
“/tmp/tmpo4j5k0ul”
>>>os.stat(temp_file.name).st_ino#>>[[ctrl-Z按下此处]]
[1] +停止蟒蛇3
$ls-li/tmp/tmpo4j5k0ul
42-rw-----1我的用户我的组0 8月14日10:33/tmp/tmpo4j5k0ul
$rm/tmp/tmpo4j5k0ul#/tmp/tmpo4j5k0ul#os.fstat(temp_file.fileno()).st_ino#>temp_file.seek(0)
0
>>>temp_file.read()文件
b“
>>>f=open(temp_file.name)#>>os.fstat(f.fileno()).st#>f.read()
'你好\n'

关于如何修复此问题,您可能会发现您的
getui.download
可以选择传递文件对象而不是文件名,或者至少可以打开现有文件进行写入,而不是删除和重新创建。同样,如果没有
getui.download
来源的确切细节,很难给出明确的建议,但这将是您需要遵循的原则。

我猜
getui.download
正在删除并重新创建该文件,因此它将写入不同于Python已打开的inode的inode(不再有任何关联的目录项)。重新打开文件时,您现在看到的是由
getui.download
编写的同一inode。如果可以,请发布一个最小的可复制示例(特别是在这里,显示
getui
的来源),然后就可以验证这一点。@alaniwi
getui.download
方法调用的是
boto3.session.session.client
对象的
download\u file
方法,该方法将文件从
path
下载到
localPath
默认的bucket
getui.download
方法调用的是
boto3.session.session.client
对象的
下载文件方法
,默认情况下,该方法将文件从
路径
下载到
本地路径
。我将尝试您的方法,thx。
temp_file = tempfile.NamedTemporaryFile()
getui.download(path=f"{path}{file}", localPath=temp_file.name)
temp_file.seek(0)
import ipdb;ipdb.set_trace()
item = {"file": temp_file, "filename": file}
queue.put(item)
>>> temp_file = tempfile.NamedTemporaryFile()

>>> temp_file.name
'/tmp/tmpo4j5k0ul'

>>> os.stat(temp_file.name).st_ino  # <=== look at the inode number
42

>>> [[ctrl-Z pressed here]]
[1]+  Stopped                 python3

$ ls -li /tmp/tmpo4j5k0ul 
42 -rw------- 1 myuser mygroup 0 Aug 14 10:33 /tmp/tmpo4j5k0ul

$ rm /tmp/tmpo4j5k0ul   # <=== delete

$ echo hello > /tmp/tmpo4j5k0ul  # <=== create new file 

$ ls -li /tmp/tmpo4j5k0ul  # <=== see the new inode number
41 -rw-rw-r-- 1 myuser mygroup 6 Aug 14 10:34 /tmp/tmpo4j5k0ul

$ fg   # <=== return to the python session 
python3

>>> os.fstat(temp_file.fileno()).st_ino  # <=== recheck the inode number
42   # <=== still the old one

>>> temp_file.seek(0)
0

>>> temp_file.read()
b''

>>> f = open(temp_file.name)  # <=== reopen from the filename

>>> os.fstat(f.fileno()).st_ino  # <=== recheck the inode number
41  # <=== the new one this time

>>> f.read()
'hello\n'