Python 无法从临时文件中读取内容
python:3.6.8Python 无法从临时文件中读取内容,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正在删除并重新创建文件,因此它将
代码: 我无法从
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
的来源),然后就可以验证这一点。@alaniwigetui.download
方法调用的是boto3.session.session.client
对象的download\u file
方法,该方法将文件从path
下载到localPath
默认的bucketgetui.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'