使用 pysftp 拆分 SFTP 目录中的文本文件
Using pysftp to split text file in SFTP directory
我正在尝试使用 python pysftp 将大小为 100 MB(具有唯一行)的文本文件拆分为 10 个大小相等的文件,但我无法找到相同的正确方法。
请告诉我如何从 SFTP 目录读取/拆分文件并将所有文件放回 FTP 目录本身。
with pysftp.Connection(host=sftphostname, username=sftpusername, port=sftpport, private_key=sftpkeypath) as sftp:
with sftp.open(source_filedir+source_filename) as file:
for line in file:
<....................Unable to decide logic------------------>
我不认为 FTP / SFTP 允许比简单地下载文件更聪明的事情。也就是说,您必须获取整个文件,在本地拆分它,然后将新文件放回去。
对于文本文件拆分逻辑我相信这个线程可能有用:Split large files using python
你大概需要的逻辑如下:
由于您处于只读环境,您需要将整个文件下载到内存中。
使用Python的io.StringIO()
把内存中的数据当作文件来处理。
当你在谈论行时,我假设你的意思是文件是 CSV 格式?您可以使用 Python 的 csv
库来解析文件。
首先使用 csv.reader()
快速扫描文件,用它来计算文件中的行数。然后,这可用于确定如何将文件拆分为相等数量的行,而不是仅按设置的字节数拆分文件。
一旦知道行数,重新打开数据(再次作为文件)并只读入 header 行。然后可以将其添加到每个行的第一行拆分您创建的文件。
现在阅读 n
行(基于您的总行数)。使用一个csv.writer()
和另一个io.StringIO()
先写入header行,然后将拆分行写入内存。然后,这可以用于使用 pysftp
上传到服务器上的新文件,所有这些都不需要访问实际的文件系统。
结果将是每个文件也将有一个有效的 header 行。
有一个类似 filesplit 的库可以用来分割文件。
它具有类似 Linux 命令 split
或 csplit
.
的功能
你的情况
split text file of size 100 MB into 10 files of equal size
你可以使用方法 bysize
:
import os
from filesplit.split import Split
infile = source_filedir + source_filename
outdir = source_filedir
split = Split(infile, outdir) # construct the splitter
file_size = os.path.getsize(infile)
desired_parts = 10
bytes_per_split = file_size / desired_parts # have to calculate the size
split.bysize(bytes_per_split)
对于 line-partitioned 拆分使用 bylinecount
:
from filesplit.split import Split
split = Split(infile, outdir)
split.bylinecount(1_000_000) # for a million lines each file
另请参阅:
- Split Command in Linux: 9 Useful Examples
- How do I check file size in Python?
奖金
从 Python 3.6 开始,您可以在数字文字中使用下划线(参见 PEP515):million = 1_000_000
以提高可读性,
我正在尝试使用 python pysftp 将大小为 100 MB(具有唯一行)的文本文件拆分为 10 个大小相等的文件,但我无法找到相同的正确方法。
请告诉我如何从 SFTP 目录读取/拆分文件并将所有文件放回 FTP 目录本身。
with pysftp.Connection(host=sftphostname, username=sftpusername, port=sftpport, private_key=sftpkeypath) as sftp:
with sftp.open(source_filedir+source_filename) as file:
for line in file:
<....................Unable to decide logic------------------>
我不认为 FTP / SFTP 允许比简单地下载文件更聪明的事情。也就是说,您必须获取整个文件,在本地拆分它,然后将新文件放回去。
对于文本文件拆分逻辑我相信这个线程可能有用:Split large files using python
你大概需要的逻辑如下:
由于您处于只读环境,您需要将整个文件下载到内存中。
使用Python的
io.StringIO()
把内存中的数据当作文件来处理。当你在谈论行时,我假设你的意思是文件是 CSV 格式?您可以使用 Python 的
csv
库来解析文件。首先使用
csv.reader()
快速扫描文件,用它来计算文件中的行数。然后,这可用于确定如何将文件拆分为相等数量的行,而不是仅按设置的字节数拆分文件。一旦知道行数,重新打开数据(再次作为文件)并只读入 header 行。然后可以将其添加到每个行的第一行拆分您创建的文件。
现在阅读
n
行(基于您的总行数)。使用一个csv.writer()
和另一个io.StringIO()
先写入header行,然后将拆分行写入内存。然后,这可以用于使用pysftp
上传到服务器上的新文件,所有这些都不需要访问实际的文件系统。
结果将是每个文件也将有一个有效的 header 行。
有一个类似 filesplit 的库可以用来分割文件。
它具有类似 Linux 命令 split
或 csplit
.
你的情况
split text file of size 100 MB into 10 files of equal size
你可以使用方法 bysize
:
import os
from filesplit.split import Split
infile = source_filedir + source_filename
outdir = source_filedir
split = Split(infile, outdir) # construct the splitter
file_size = os.path.getsize(infile)
desired_parts = 10
bytes_per_split = file_size / desired_parts # have to calculate the size
split.bysize(bytes_per_split)
对于 line-partitioned 拆分使用 bylinecount
:
from filesplit.split import Split
split = Split(infile, outdir)
split.bylinecount(1_000_000) # for a million lines each file
另请参阅:
- Split Command in Linux: 9 Useful Examples
- How do I check file size in Python?
奖金
从 Python 3.6 开始,您可以在数字文字中使用下划线(参见 PEP515):million = 1_000_000
以提高可读性,