将文本文件绑定到本地端口以从中读取

时间:2017-02-24 10:11:47

标签: python file sockets pyspark

我正在寻找一种方法将文本文件绑定到我的机器上的端口,与流动的Linux命令相同

cat myfile.txt | pv -l -L 2000 -q | nc -lk 9999

我想在Windows上使用它,所以我不能直接使用上面的命令。我想这样做,因为我有另一个Python代码(使用pyspark),它从这个端口读取数据作为流。

data = StreamingContext(sc, 1).socketTextStream("localhost", 9999)

1 个答案:

答案 0 :(得分:1)

https://docs.python.org/2/library/socket.html可能是相关的文档。

我对pyspark一无所知,但我的猜测是这样的:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 9999))
s.listen(1)
con, adr = s.accept()
with open('myfile.txt') as f:
    for line in f:
        con.sendall(line)
con.close()

应该有效。它逐行发送,这可能适用于您的用例(我注意它是一个文本文件)。

如果你想要在你去的时候打印一些统计数据:

from __future__ import print_function
import sys
import socket

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

s.bind(('', 9999))
s.listen(1)
print('listening')
con, adr = s.accept()
print('connected')

with open('myfile.txt') as f:
    f.seek(0,2) # go to end of file
    filesize = f.tell()
    f.seek(0)
    sent = 0

    for line in f:
        con.sendall(line)
        sent += len(line)
        print('%s of %s' % (sent, filesize), end='\r')
        sys.stdout.flush()

con.close()

此代码发送文件,然后关闭。如果您希望它重复发送文件,或将其发送给多个客户端,那么您可以扩展它来执行此操作,但它有点复杂。