使用 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

你大概需要的逻辑如下:

  1. 由于您处于只读环境,您需要将整个文件下载到内存中。

  2. 使用Python的io.StringIO()把内存中的数据当作文件来处理。

  3. 当你在谈论行时,我假设你的意思是文件是 CSV 格式?您可以使用 Python 的 csv 库来解析文件。

  4. 首先使用 csv.reader() 快速扫描文件,用它来计算文件中的行数。然后,这可用于确定如何将文件拆分为相等数量的行,而不是仅按设置的字节数拆分文件。

  5. 一旦知道行数,重新打开数据(再次作为文件)并只读入 header 行。然后可以将其添加到每个行的第一行拆分您创建的文件。

  6. 现在阅读 n 行(基于您的总行数)。使用一个csv.writer()和另一个io.StringIO()先写入header行,然后将拆分行写入内存。然后,这可以用于使用 pysftp 上传到服务器上的新文件,所有这些都不需要访问实际的文件系统。

结果将是每个文件也将有一个有效的 header 行。

有一个类似 filesplit 的库可以用来分割文件。 它具有类似 Linux 命令 splitcsplit.

的功能

你的情况

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 

另请参阅:

奖金

从 Python 3.6 开始,您可以在数字文字中使用下划线(参见 PEP515):million = 1_000_000 以提高可读性,