所周知,python最强大的地方在于,python社区汇总拥有丰富的第三方库,开源的特性,使得有越来越多的技术开发者来完善。
python的完美性。
未来人工智能,大数据方向,区块链的识别和进阶都将以python为中心来展开。
咳咳咳! 好像有点打广告的嫌疑了。
当前互联网信息共享时代,最重要的是什么?是数据。最有价值的是什么?是数据。最能直观体现技术水平的是什么?还是数据。
所以,今天我们要分享的是:如何来获取各个文件格式的文本信息。
普通文件的格式 一般分为: txt普通文本信息,doc word文档,html网页内容,excel表格数据,以及特殊的mht文件。
一、Python处理html网页信息
html类型的文本数据,内容是由前端代码书写的标签+文本数据的格式,可以直接在chrome浏览器打开,清楚 的展示出文本的格式。
python 获取html文件的内容和获取txt文件的方法相同,直接打开文件读取就可以了。
读取代码如下:
with open(html_path, "r", encoding="utf-8") as f: file = f.read()
file 是html文件的文本内容。是一个网页标签的格式内容。
二、Python处理excel表格信息
python拥有直接操作excel表格的第三方库xlwt,xlrd。调用对应的方法就可以读写excel表格数据。
读取excel操作代码如下:
filepath = "C:\\Users\Administrator\Desktop\新建文件夹\笨笨 前程6份 武汉.xls" sheet_name = "UserList" rb = xlrd.open_workbook(filepath) sheet = rb.sheet_by_name(sheet_name) # clox_list = [0, 9, 14, 15, 17] for row in range(1, sheet.nrows): w = WriteToExcel() # for clox in clox_list: name = sheet.cell(row, 0).value phone = sheet.cell(row, 15).value address = sheet.cell(row, 9).value major = sheet.cell(row, 14).value age = sheet.cell(row, 8).value
其中row是表格数据对应的行数, cell获取具体行数,列数的具体数据。
三、Python读取doc文档数据
python读取doc文档是最麻烦的。处理逻辑复杂。处理的方式也有很多种。
python 没有直接处理doc文档的第三方库,但是有一个处理docx的第三方库。可以通过将doc文件转换为docx文件,再调用第三方python库pydocx来读取doc文档的内容。
这里需要注意的是,不要直接修改doc的后缀来修改成docx文件。直接通过修改后缀获取的docx文件,pydocx无法读取内容。
我们可以使用另外一个库来修改doc为docx。
具体代码如下:
def doSaveAas(self, doc_path): """ 将doc文档转换为docx文档 :rtype: object """ docx_path = doc_path.replace("doc", "docx") word = wc.Dispatch('Word.Application') doc = word.Documents.Open(doc_path) # 目标路径下的文件 doc.SaveAs(docx_path, 12, False, "", True, "", False, False, False, False) # 转化后路径下的文件 doc.Close() word.Quit()
代码所需的包接口:
import os import zipfile from win32com import client as wc import xlrd from bs4 import BeautifulSoup from pydocx import PyDocX from lxml import html from xpath_content import XpathContent from write_to_excel import WriteToExcel
python处理docx文档的方法有很多种,具体使用情况,根据个人需求来决定。
No.1 解压docx文件
docx文件的原理,本质上就是一个压缩的zip文件,通过解压以后,就可以获取原来文件的各个内容。
docx解压后的文件结构如下:
docx文件的文本内容存储结构如下:
文本内容存储于word/document.xml文件中。
第一种方法,我们就可以先将docx还原成zip压缩文件,再解压zip文件,读取word/document.xml文件的内容就ok了。
具体操作代码如下:
def get_content(self): """ 获取docx文档的文本内容 :rtype: object """ os.chdir(r"C:\Users\Administrator\Desktop\新建文件夹") # 改变目录到文件的目录 # os.rename("51 2014.09.12 1份Savannah.docx", "51 2014.09.12 1份Savannah.ZIP") # 重命名为zip文件 f = zipfile.ZipFile('51 2014.09.12 1份Savannah.ZIP', 'r') # 进行解压 xml = f.read("word/document.xml") wordObj = BeautifulSoup(xml.decode("utf-8")) # print(wordObj) texts = wordObj.findAll("w:t") content = [] for text in texts: content.append(text.text) content_str = "".join(content) return content_str
最后获取到的就是docx文档的所有文本数据了。
No.2 将docx文档转换成python能够处理的文本格式
第一种方法,是依据docx文档的原理来获取数据,流程有点繁琐,有没有能直接读取docx文档内容的方法呢?答案,肯定是没有的,别想了,洗洗回家睡吧。
直接读取docx文档的方法没有,有没有能够将docx文档转换成python能够轻松处理的文本格式呢?
这个可以有,前面说了,python拥有大量丰富的第三方库(先夸一波我大python),历经千辛万苦终于找到了,一个能转换docx文档格式的第三方库,pydocx,pydocx库中有个方法pydocx.to_html()就可以直接将docx文档转换为html文件,怎么样?意不意外,惊喜不惊喜!
第二种方法,转换文本格式的代码如下:
def docx_to_html(self, docx_path): """ docx文档转换成html响应 :rtype: object """ # docx_path = "C:\\Users\Administrator\Desktop\新建文件夹\\51 2014.09.12 1份Savannah.docx" response = PyDocX.to_html(docx_path)
获取到的response是html文件内容。
四、Python处理mht文件
mht文件是一种只能在IE浏览器上展示的文本格式,在chrome浏览器中打开是一堆的乱码。
No.1 伪造IE请求mht文件内容
最基础的读取mht文本的方法就是伪造IE浏览器请求。
调用requests库,发送get请求网页链接,构造IE的请求头信息。
理论上来说,这种方法是可行的。但是呢,不建议用,原因大家都懂得。
No.2 转换文件格式
好了说正经的方法,猜测mht文件能否修改成其他文件格式来直接读取呢?
docx,不行;html,不行;excel,更不用说了。
真相只有一个!!!
直接修改后缀得到的docx,无法读取。
so,我们想到的方法是什么呢。没错,就是修改成doc文档。
方法是匪夷所思的,但也是灵感一现。
mht可以直接通过修改后缀转换成doc文档,doc文档读取文本内容的方法具体参考上面读取doc文档的方法。
如何获取html文本的内容?
html文本的内容是网页结构标签数据,取出文本的方式是:re正则,或者xpath。
后续,小伙伴有需要的话,会再开一章详细了解re,xapth的使用规则。
来源网络,侵权联系删除
设您需要使用 JavaScript 在服务器上读取多个文件。Node.js 这样的运行时环境中有许多读取文件的方法。哪一种最好?让我们来考虑各种方法。
使用 fs.promises
const fs = require('fs/promises');
const readFile = fs.readFile;
readFile("lipsum.txt", { encoding: 'utf-8' })
.then((data) => {...})
.catch((err) => {...})
使用 fs.readFile 和 util.promisify
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
readFile("lipsum.txt", { encoding: 'utf-8' })
.then((data) => {...})
.catch((err) => {...})
使用 fs.readFileSync
const fs = require('fs');
const readFileSync = fs.readFileSync;
var data = readFileSync("lipsum.txt", { encoding: 'utf-8' })
使用 await fs.readFileSync
const fs = require('fs');
const readFileSync = fs.readFileSync;
async function f(name, options) {
return readFileSync(name, options);
}
使用 fs.readFile
const fs = require('fs');
const readFile = fs.readFile;
fs.readFile('lipsum.txt', function read(err, data) {...});
性能测试
我写了一个小的 性能测试,重复从磁盘读取一个文件。这是一个简单的循环,每次访问同一个文件。我报告读取文件 50,000 次需要的毫秒数。文件相对较小(略超过一千字节)。我使用装有数十个 Ice Lake Intel 核心和大量内存的大型服务器。我使用的是 Node.js 20.1 和 Bun 1.0.14。Bun 是一个竞争的 JavaScript 运行时。
我多次运行了基准测试,并在所有情况下报告最好的结果。您的结果可能会有所不同。
Node.js时间 | Bun时间 | |
fs.promises | 2400 ms | 110 ms |
fs.readFile 和 util.promisify | 1500 ms | 180 ms |
fs.readFileSync | 140 ms | 140 ms |
await fs.readFileSync | 220 ms | 180 ms |
fs.readFile | 760 ms | 90 ms |
至少在我的系统上,在这个测试中,使用 Node.js 的 fs.promises 明显比其他任何方法的成本更高。Bun 运行时在这个测试中比 Node.js 快得多。
对于fs.promises,结果比看起来更糟的是以下这个意义。我发现readFileSync使用了 300 ms 的 CPU 时间,而fs.promises则使用了 7 秒的 CPU 时间。这是因为在基准测试期间,fs.promises触发了多个核心的工作。
将文件大小增加到例如 32kB,并不改变结论。如果使用显著更大的文件,许多 Node.js 情况会因为“堆限制分配失败”而出错。Bun 即使在大文件中也能继续运行。使用 Bun 的测试结果不改变结论:我的测试表明即使对于大文件,fs.readFile 也始终更快。
致谢。我的基准测试灵感来源于 Evgenii Stulnikov 提供的一个测试案例。
于安全和隐私的原因,web 应用程序不能直接访问用户设备上的文件。如果需要读取一个或多个本地文件,可以通过使用input file和FileReader来实现。在这篇文章中,我们将通过一些例子来看看它是如何工作的。
由于浏览器中的 JS 无法从用户的设备访问本地文件,我们需要为用户提供一种方法来选择一个或多个文件供我们使用。这可以通过文件选择器<input type='fule' />来完成。
<input type="file" id="fileInput">
如果想允选择多个文件,可以添加multiple属性:
<input type="file" id="fileInput" multiple>
我们可以通过change事件来监听文件的选择,也可以添加另一个 UI 元素让用户显式地开始对所选文件的处理。
input file 具有一个files属性,该属性是File对象的列表(可能有多个选择的文件)。
File对象如下所示:
读取文件,主要使用的是[FileReader][1]类。
「该对象拥有的属性:」
「FileReader.error」 :只读,一个DOMException,表示在读取文件时发生的错误 。
「FileReader.readyState」:只读 表示 FileReader 状态的数字。取值如下:
常量名值描述EMPTY0还没有加载任何数据LOADING1数据正在被加载DONE2已完成全部的读取请求
「FileReader.result」:只读,文件的内容。该属性仅在读取操作完成后才有效,数据的格式取决于使用哪个方法来启动读取操作。
「该对象拥有的方法:」
readAsText(file, encoding):以纯文本形式读取文件,读取到的文本保存在result属性中。第二个参数代表编码格式。
readAsDataUrl(file):读取文件并且将文件以数据URI的形式保存在result属性中。
readAsBinaryString(file):读取文件并且把文件以字符串保存在result属性中。
readAsArrayBuffer(file):读取文件并且将一个包含文件内容的ArrayBuffer保存咋result属性中。
FileReader.abort():中止读取操作。在返回时,readyState属性为DONE。
「文件读取的过程是异步操作,在这个过程中提供了三个事件:progress、error、load事件。」
progress:每隔50ms左右,会触发一次progress事件。
error:在无法读取到文件信息的条件下触发。
load:在成功加载后就会触发。
在下面的示例中,我们将使用readAsText和readAsDataURL方法来显示文本和图像文件的内容。
为了将文件内容显示为文本,change需要重写一下:
首先,我们要确保有一个可以读取的文件。如果用户取消或以其他方式关闭文件选择对话框而不选择文件,我们就没有什么要读取和退出函数。
然后我们继续创建一个FileReader。reader的工作是异步的,以避免阻塞主线程和 UI 更新,这在读取大文件(如视频)时非常重要。
reader发出一个'load'事件(例如,类似于Image对象),告诉我们的文件已经读取完毕。
reader将文件内容保存在其result属性中。此属性中的数据取决于我们使用的读取文件的方法。在我们的示例中,我们使用readAsText方法读取文件,因此result将是一个文本字符串。
如果我们想要显示图像,将文件读取为字符串并不是很有用。FileReader有一个readAsDataURL方法,可以将文件读入一个编码的字符串,该字符串可以用作<img>元素的源。本例的代码与前面的代码基本相同,区别是我们使用readAsDataURL读取文件并将结果显示为图像:
1)由于安全和隐私的原因,JavaScript 不能直接访问本地文件。
2)可以通过 input 类型为 file 来选择文件,并对文件进行处理。
3) file input 具有带有所选文件的files属性。
4) 我们可以使用FileReader来访问所选文件的内容。
作者: Martin Splitt 译者:前端小智 来源:dev
原文:https://dev.to/g33konaut/reading-local-files-with-javascript-25hn
*请认真填写需求信息,我们会在24小时内与您取得联系。