【问题标题】:extracting list of xml files from tar.gz file from ftp server从 ftp 服务器的 tar.gz 文件中提取 xml 文件列表
【发布时间】:2019-05-12 10:38:22
【问题描述】:

我需要提取我正在尝试读取的 tar.gz 文件中的 xml 文件列表。

我试过这个:

import os
from ftplib import FTP

def writeline(data):
    filedata.write(data)
    filedata.write(os.linesep)

ftp = FTP('ftp.my.domain.com')
ftp.login(user="username",passwd="password")
ftp.cwd('inner_folder')
filedata = open('mytargz.tar.gz', 'w')
ftp.retrlines('RETR %s' % ftp.nlst()[0], writeline)

我使用了ftp.nlst()[0],因为我的 ftp 中有一个 tar.gz 文件列表。 看起来我在writeline 回调中收到的data 是一些奇怪的符号,而filedata.write(data) 则抛出错误: {UnicodeEncodeError}'charmap' codec can't encode character '\x8b' in position 1: character maps to <undefined>。 我真的可以在这里使用一些帮助..

【问题讨论】:

  • 你想要的是 tarfile 通知,你可以将文件对象传递给它,所以将你的 ftp 读入 byteIO io.BytesIO(my_bytes)
  • 是的,我认为这是错误的,但我收到的 data 是一串奇怪的符号,所以我收到错误 a bytes-like object is required, not 'str'.. 那里似乎有问题, 在我解压缩文件之前。
  • “字符串”没有问题。你正在接收字节,它不是文本,你不能像文本一样打印
  • io.BytesIO(data) 抛出错误a bytes-like object is required, not 'str'
  • 我看到了这个问题,您使用 retrlines 而不是 retrbinary 并且当您打开文件时使用 'wb' 打开它以写入二进制文件而不是 'w'

标签: python xml ftp gzip tarfile


【解决方案1】:

我没有 ftp 服务器可以尝试这个,但这应该可以:

import os
from ftplib import FTP

def writeline(data):
    filedata.write(data)

ftp = FTP('ftp.my.domain.com')
ftp.login(user="username",passwd="password")
ftp.cwd('inner_folder')
filedata = open('mytargz.tar.gz', 'wb')
ftp.retrbinary('RETR %s' % ftp.nlst()[0], writeline)



请注意,我们使用 write binary 'wb' 打开文件,并要求 ftp 返回二进制而不是文本,并且我们的回调函数只写入而不添加分隔符

【讨论】:

  • 完成这一切之后,在writeline 方法中我添加了:tarfile.open('my_tar_gz.tar.gz', "r:gz").extractall("xmls") 用于从my_tar_gz.tar.gz 文件中提取我的文件。我看到文件有数据 - 几个xml文件,你知道tarfile.open命令抛出ReadError: empty file的原因可能是什么吗?
  • 你怎么知道文件有数据?你是用外部程序打开的吗?
  • 如果错误来自 tarfile.open() 那么我唯一能想到的是你不小心打开了错误的文件。据我所知,错误不会在有效的非空文件中弹出
猜你喜欢
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多