我正在尝试使用python中的ssh从服务器读取文件.我正在使用paramiko进行连接.我可以连接到服务器并运行像'cat filename'这样的命令并从服务器获取数据,但我尝试读取的一些文件大小约为1 GB或更多.
如何使用python逐行读取服务器上的文件?
附加信息:经常做的是运行'cat filename'命令并将结果存储在变量中并解决该问题.但由于这里的文件非常大,我正在寻找一种逐行读取文件的方法.
编辑:我可以读取一堆数据并将其拆分成行,但问题是缓冲区中接收的数据并不总是包含完整的行.例如,如果缓冲区有300行,则最后一行可能只是服务器上行的一半,下一半将在下次调用服务器时获取.我想要完整的线条
编辑2:我可以使用什么命令在特定范围内的文件中打印行.喜欢打印前100行,那么接下来的100行等等?这样缓冲区将始终包含完整的行.
我正在尝试开始使用Paramiko库,但是当我尝试连接以下简单程序时,库就会抛出异常:
import paramiko
ssh = paramiko.SSHClient()
ssh.connect('127.0.0.1', username='boatzart', password='mypassword')
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Traceback (most recent call last):
File "test.py", line 6, in <module>
ssh.connect('127.0.0.1')
File "build/bdist.macosx-10.7-intel/egg/paramiko/client.py", line 316, in connect
File "build/bdist.macosx-10.7-intel/egg/paramiko/client.py", line 85, in missing_host_key
paramiko.SSHException: Unknown server 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
无论我尝试哪种服务器都会发生这种情况
我正在尝试使用Paramiko从SFTP下载CSV文件(内存中),并将其导入到pandas数据框中。
transport = paramiko.Transport((server, 22))
transport.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(transport)
with open(file_name, 'wb') as fl:
sftp.getfo(file_name, fl, callback=printTotals)
df = pd.read_csv(fl, sep=' ')
Run Code Online (Sandbox Code Playgroud)
下面的代码失败,告诉我:
OSError:文件未打开以供读取
我假设我需要某种缓冲区或类似对象的文件fl,因为open需要一个文件。我对这一切还比较陌生,所以如果有人可以帮忙,我会很高兴。
我正在使用 Paramiko 访问远程 SFTP 文件夹,并且尝试编写代码将文件从 SFTP 中的路径传输到 AWS S3 存储桶(使用文件元数据检查其上次修改日期的简单逻辑)。我已经使用 Boto3 设置了与 S3 的连接,但我似乎仍然无法编写一个工作代码来传输文件而不先将它们下载到本地目录。这是我使用 Paramiko 的getfo()方法尝试的一些代码。但这不起作用。
for f in files:
# get last modified from file metadata
last_modified = sftp.stat(remote_path + f).st_mtime
last_modified_date = datetime.fromtimestamp(last_modified).date()
if last_modified_date > date_limit: # check limit
print('getting ' + f)
full_path = f"{folder_path}{f}"
fo = sftp.getfo(remote_path + f,f)
s3_conn.put_object(Body=fo,Bucket=s3_bucket, Key=full_path)
Run Code Online (Sandbox Code Playgroud)
谢谢你!
我正在尝试读取 Python 内存中 SFTP 上的 CSV 文件。我尝试了以下方法,它适用于 FTP 连接,但不适用于 SFTP。
例如,我想复制:
df = pd.read_csv(...)
Run Code Online (Sandbox Code Playgroud)
但不首先将其存储在本地(原因是因为我想将其作为云函数运行,然后我不希望本地文件在我的缓存中)。
我怎样才能做到不同呢?
def read_file_sftp_local_memory(sftp, path, filename):
flo = BytesIO()
path_query = "".join(['RETR ', path, '/', filename])
sftp.retrbinary(path_query, flo.write)
flo.seek(0)
return flo
Run Code Online (Sandbox Code Playgroud)
我还尝试了以下方法:
def read_file_csv(sftp, path, filename):
# Download
sftp.get("/".join( os.path.join(path, filename) ), filename)
# Read
df = pd.read_csv(filename)
# Delete
os.remove(filename)
# Return
return df
Run Code Online (Sandbox Code Playgroud)
但返回这个错误:
df = pd.read_csv(...)
Run Code Online (Sandbox Code Playgroud) 我正在使用paramiko在python中打开一个远程sftp文件.使用paramiko返回的文件对象,我逐行读取文件并处理信息.与使用来自os的python内置方法'open'相比,这看起来真的很慢.以下是我用来获取文件对象的代码.
使用paramiko(慢2倍) -
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(myHost,myPort,myUser,myPassword)
sftp = client.open_sftp()
fileObject = sftp.file(fullFilePath,'rb')
Run Code Online (Sandbox Code Playgroud)
使用os -
import os
fileObject = open(fullFilePath,'rb')
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?有没有办法使paramiko fileobject读取方法与使用os fileobject的方法一样快?
谢谢!!