我正在尝试实现一个流,它在每个'data'事件中从文件返回一个符号。 我完成了以下代码:
var util = require('util'),
fs = require('fs'),
Readable = require('stream').Readable;
var util = require('util');
var Readable = require('stream').Readable;
var SymbolReadStream = function(filename, options) {
Readable.call(this);
this._readable = fs.createReadStream(filename, options).pause();
self = this;
this._readable.on('readable', function() {
var chunk;
chunk = self._readable.read(1);
// I believe the problem is here
self._readable.pause();
});
};
util.inherits(SymbolReadStream, Readable); // inherit the prototype methods
SymbolReadStream.prototype._read = function() {
this._readable.resume();
};
var r = new SymbolReadStream("test.txt", {
encoding: 'utf8',
});
r.on('data', function(el) {
console.log(el);
});
但此代码不起作用。请帮忙。 有没有更简单的方法来实现这种行为?
答案 0 :(得分:3)
This post提供了一个很好的线索,如何回答你的问题。
另外,你应该在pipe采取循环,这将是一种更清洁的方式来完成你想要做的事情:管道适配器到文件流而不是包装起来
那就是说,我不会在这里重新发明轮子,而只是寻找可以实现这一目标的模块。特别是“拆分”模块,使它们分成每个字符,而不是新行。例如,event-stream有一个split方法,“采用与string.split相同的参数,但默认为'\ n'而不是','”。所以逻辑是尝试myStream.pipe(es.split(''))
,但是模块会像myStream.pipe(es.split())
那样在线上打破。所以这是我的解决方案,使用正则表达式“ break on each char ”
var es = require('event-stream');
var fs = require('fs');
var symbolStream = fs.createReadStream(filename, options).pipe(es.split(/(?!$)/));
编辑:事件流似乎在内部使用split模块,因此您甚至可以尝试
var split = require('split');
var fs = require('fs');
var symbolStream = fs.createReadStream(filename, options).pipe(split(/(?!$)/));
(this loose test负责将''
转换为\r\n
)
答案 1 :(得分:1)
在流实现中,没有向处理程序发出'data'事件。因此,with open('urllist.txt', 'r') as urls, open('somefile.txt', 'a') as output:
for url in urls:
page = requests.get(url.strip())
tree = html.fromstring(page.content)
visitors = tree.xpath('//b["no-visitors"]/text()')
print 'Visitors: ', visitors
print >> output, 'Visitors:', visitors
永远不会被调用。添加事件后,它们将逐个符号流式传输。示例如下:
console.log