linux下编辑python文件_使用python编写linux文件传输命令

1.这里使用到的模块有:socket , os ,sys , struct ,fire ,将其导入,如下图

import socket

import os

import sys

import struct

import fire

2.发送端

def tran(self,ip,tfname='file'):#默认文件名是file

p=ProgressBar(total=100) #设置进度条总数为100

tserver_adress = (ip, 1997) #用元组保存ip和端口,端口默认是1997

max_size = 1024 #设定每一次传输1024字节

if os.path.isfile(tfname): #判断是否是一个文件

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #使用tcp

client.connect(tserver_adress)

print('Starting the tran at')

asize=os.stat(tfname).st_size #获取文件大小

fmessage=struct.pack('128sl',os.path.basename(tfname).encode('utf-8'),asize) #将文件名,文件大小转换为字符串

client.send(fmessage) #先把文件信息发给接收端

b=0

w=open(tfname,'rb') #用二进制打开该文件

while True:

p.log('%.2lf' %(b/asize*100)) #进度条精确到小数点后俩位

s = w.read(max_size) #读取

if not s:

break

client.send(s)

b += 1024

w.close()

client.close()

print('\nsend sucess!!\n')

3.接收端

def recv(self,ip):

p=ProgressBar(total=100)

max_size = 1024

print('Starting the recv at')

server_address = (ip, 1997)

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.bind(server_address)

server.listen(1)

client, addr = server.accept()

client.settimeout(1000)

file_size = struct.calcsize('128sl') #设定格式

print('wait for a client to call')

bf=client.recv(file_size) #按上面file_size格式接受文件信息

if bf:

fname, fsize = struct.unpack('128sl', bf)

newfname = fname.strip(b'\x00') #去掉文件名后面的...\x00...字符

print('now recv a file %s, filesize is %s' %(newfname,fsize))

k=input('please input y or n,Confirm acceptance:')

if k == 'y':

r = open(newfname, 'wb')

print('start receiving....')

alldata=0

while not alldata == fsize:

p.log('%.2lf' %(alldata / fsize * 100))

if fsize-alldata>1024:

data= client.recv(max_size)

alldata+=len(data)

else:

data=client.recv(fsize-alldata)

alldata=fsize

r.write(data)

r.close()

elif k=='n':

print('over!')

os._exit(0)

server.close()

print('\nrecv success!!!\n')

接收端代码和发送端没多大区别。。。

4.实现命令行进度条

class ProgressBar:

def __init__(self, count = 0, total = 0, width = 50):

self.count = count

self.total = total

self.width = width

self.pp=0

def move(self,d):

self.count = d

def log(self,d):

sys.stdout.flush()

p=int(float(d)) #将base 10字符串装换为int型

if p-self.pp == 1:

sys.stdout.write('{0:3}/{1:3}: '.format(d, self.total))

self.pp=p

sys.stdout.write('#' * int(p/2) + '-' * (self.width - int(p/2)) + '\r')

if p == self.width:

sys.stdout.write('\n')

sys.stdout.flush()

5.运行效果

确认是否接收

传输过程

传输完成

6.使用方法

Usage:        1.recv:ftf recv [ip]

2.tran:ftf tran [ip] [filename]

When using, open the receiver first(recv), development of sending again(tran)!(有道翻译的,英文太差!!)

7.完整项目代码

https://git.oschina.net/nanxun/file_to_file

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值