[英]Write objects into file with Node.js
我已經在整個stackoverflow/google上搜索過這個,但似乎無法弄清楚。
我正在抓取給定 URL 頁面的社交媒體鏈接,該函數返回一個帶有 URL 列表的對象。
當我嘗試將此數據寫入不同的文件時,它會以[object Object]
而不是預期的形式輸出到文件中:[ ' https://twitter.com/#!/101Cookbooks ', ' http://www. facebook.com/101cookbooks '] 就像我console.log()
結果一樣。
這是我在 Node 中讀取和寫入文件的可悲嘗試,嘗試讀取每一行(url)並通過函數調用request(line, gotHTML)
:
fs.readFileSync('./urls.txt').toString().split('\n').forEach(function (line){
console.log(line);
var obj = request(line, gotHTML);
console.log(obj);
fs.writeFileSync('./data.json', obj , 'utf-8');
});
供參考—— gotHTML
函數:
function gotHTML(err, resp, html){
var social_ids = [];
if(err){
return console.log(err);
} else if (resp.statusCode === 200){
var parsedHTML = $.load(html);
parsedHTML('a').map(function(i, link){
var href = $(link).attr('href');
for(var i=0; i<socialurls.length; i++){
if(socialurls[i].test(href) && social_ids.indexOf(href) < 0 ) {
social_ids.push(href);
};
};
})
};
return social_ids;
};
在 deb2fast 所說的基礎上,我還將向 JSON.stringify() 傳遞幾個額外的參數以使其具有漂亮的格式:
fs.writeFileSync('./data.json', JSON.stringify(obj, null, 2) , 'utf-8');
第二個參數是一個可選的替換函數,在這種情況下你不需要它,所以null
有效。
第三個參數是用於縮進的空格數。 2 和 4 似乎是流行的選擇。
obj
在您的示例中是一個數組。
fs.writeFileSync(filename, data, [options])在 data 參數中需要String
或Buffer
。 請參閱文檔。
嘗試以字符串格式編寫數組:
// writes 'https://twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks'
fs.writeFileSync('./data.json', obj.join(',') , 'utf-8');
或者:
// writes ['https://twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks']
var util = require('util');
fs.writeFileSync('./data.json', util.inspect(obj) , 'utf-8');
編輯:您在示例中看到數組的原因是因為 node 的console.log
實現不只是調用toString
,它調用util.format
參見 console.js 源
如果你得到[object object]
然后使用JSON.stringify
fs.writeFile('./data.json', JSON.stringify(obj) , 'utf-8');
它對我有用。
根據我的經驗,JSON.stringify 比 util.inspect 稍快。 我不得不將 DB2 查詢的結果對象保存為 json 文件,該查詢返回了一個 92k 行的對象,使用 util.inspect 轉換需要很長時間才能完成,因此我通過編寫相同的 1000 條記錄對象進行了以下測試到具有這兩種方法的文件。
JSON.Stringify
fs.writeFile('./data.json', JSON.stringify(obj, null, 2));
時間:3:57(3分57秒)
結果格式:
[
{
"PROB": "00001",
"BO": "AXZ",
"CNTRY": "649"
},
...
]
實用程序檢查
var util = require('util'); fs.writeFile('./data.json', util.inspect(obj, false, 2, false));
時間:4:12(4分12秒)
結果格式:
[ { PROB: '00001',
BO: 'AXZ',
CNTRY: '649' },
...
]
你可以嘗試做 JSON.stringify(obj);
像這樣
var stringify = JSON.stringify(obj);
fs.writeFileSync('./data.json', stringify , 'utf-8');
以防萬一其他人偶然發現這一點,我在節點中使用 fs-extra 庫並將 javascript 對象寫入這樣的文件:
const fse = require('fs-extra');
fse.outputJsonSync('path/to/output/file.json', objectToWriteToFile);
進一步@Jim Schubert
和@deb2fast
的回答:
為了能夠寫出大於~100 MB
大objects
,您需要使用 for...of ,如下所示並符合您的要求。
const fsPromises = require('fs').promises; const sampleData = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"}; const writeToFile = async () => { for (const dataObject of Object.keys(sampleData)) { console.log(sampleData[dataObject]); await fsPromises.appendFile( "out.json" , dataObject +": "+ JSON.stringify(sampleData[dataObject])); } } writeToFile();
有關node.js
限制的完整參考,請參閱https://stackoverflow.com/a/67699911/3152654
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.