Python: Lue .doc-, .docx-tiedostot ja Word-virheilmoitukset

Python Read Doc Docx Two Word File Briefs Andword Failed Raise Eventerror



Kirjastot, jotka voivat lukea sanatiedostoja Pythonissa, ovat python-docx ja pywin32.

etu Haitta
python-docx Monitasoinen Voi käsitellä vain .docx-muotoa, ei voi käsitellä .doc-muotoa
pywin32 Vain Windows-käyttöjärjestelmä Sekä .doc että .docx pystyvät käsittelemään

Olen luonut pienen oppimispiirin Python-oppimista varten, tarjoten kaikille alustan keskustella Pythonista. Tervetuloa kaikille Python-oppimisryhmä: 960410445 Keskustele videoiden jakamisen oppimisesta yhdessä. Python on tulevaisuuden kehityssuunta, joka haastaa analyyttiset kykymme ja tapamme tuntea maailma. Siksi edistymme ajan mukana, otamme muutoksen vastaan ​​ja kasvamme jatkuvasti. Pythonin ydinteknologioiden hallinta on todellinen arvo.



pywin32

Tämä kirjasto on erittäin tehokas, ei vain osaa lukea sanaa, mutta pywin32: n lukeman .doc-artikkelin online-esittely ei todellakaan ole paljon, koska sitä on todella vaikea käyttää.



Seuraava on koodiesimerkki pywin32: n lukemisesta .doc, mutta taulukon lukemisessa on ongelma, lähtö on tyhjä, syytä ei tiedetä, koska sitä ei ole tarkoitettu käytettäväksi, joten perusteellista tutkimusta ei ole . Jos taulukossa on pystysuoria yhdistettyjä soluja, saat virheilmoituksen: 'Tämän kokoelman yksittäisiä rivejä ei voi käyttää, koska taulukossa on pystysuunnassa yhdistettyjä soluja.'



from win32com.client import Dispatch Word = Dispatch('Word.Application') # Open the word application # word = DispatchEx('Word.Application') # Start an independent process word.Visible = 0 # background running, not showing word.DisplayAlerts = 0 # No warning path = r'E:abc	est.doc' doc = word.Documents.Open(FileName=path, Encoding='gbk') for para in doc.paragraphs: print(para.Range.Text) for t in doc.Tables: for row in t.Rows: for cell in row.Cells: print(cell.Range.Text) doc.Close() word.Quit 

Mutta pywin32: n toinen piirre on tallentaa .doc-muoto .docx-muotoon, jotta voimme käsitellä sitä python-docx: lla.

def doc2docx(path): w = win32com.client.Dispatch('Word.Application') w.Visible = 0 w.DisplayAlerts = 0 doc = w.Documents.Open(path) newpath = os.path.splitext(path)[0] + '.docx' doc.SaveAs(newpath, 12, False, '', True, '', False, False, False, False) doc.Close() w.Quit() os.remove(path) return newpath 

python-docx

import docx fn = r'E:abc	est.docx' doc = docx.Document(fn) for paragraph in doc.paragraphs: print(paragraph.text) for table in doc.tables: for row in table.rows: for cell in row.cells: print(cell.text) 

Pystysuuntaisille yhdistetyille soluille python-docx: n käsittely on myös hyvin läheistä.



Word ei onnistunut nostamaan tapahtumaa

Indeksoinnin jälkeen .doc-tiedosto indeksoijani muuntaa sen .docx-muotoon yllä olevalla menetelmällä. Kaikki on hyvin. Ripustan työn jälkeen. Tulin katsomaan sitä seuraavana päivänä ja ilmoitin tästä virheestä:

Siloitin doc2docx-menetelmän erikseen virhetiedostoon ja ilmoitin virheestä. Tarkistin tämän virheen verkossa, eikä voittoa ollut.

Toistettujen testien jälkeen huomasin, että sivulta ilmoitettiin aina väärin, mikä osoittaa, että virhe voidaan toistaa. Kysymys on missä virhe on.

Poistan koodirivin, kunnes olen jättänyt vain virheen suorittamiseen tarvittavan koodin:

def get_winningbid_detail(url, name): r = requests.get(url) r.encoding = 'utf-8' html = r.text soup = BeautifulSoup(html, 'lxml') Ps = soup.find_all(text=re.compile('attachment')) if len(ps) > 0: os.makedirs(os.path.join(download_dir, name), exist_ok=True) for p in ps: a_tab = p.find_next_sibling('a') if a_tab is not None: link = homepage + a_tab['href'] localfilename = os.path.join(download_dir, name, a_tab.text) # print(localfilename) with open(localfilename, 'wb+') as sw: sw.write(requests.get(link).content) if localfilename.endswith('.doc'): doc2docx(localfilename) 

Tämän koodin toistuva lukeminen ei löytänyt mitään ongelmia.

Koska jotkin verkkosivun liitteiden nimet ovat samat, kuten advert.doc, sijoitin ladatun tiedoston jokaisen verkkosivun otsikon alikansioon (joka indeksoitiin yleiskatsaussivulla), joten nimiparametri välitettiin menetelmässä, ja Jos nimiparametri on tyhjä, virheestä ei ilmoiteta.

Itse asiassa jo voidaan havaita, että vika on olemassa, mutta en odottanut sitä, ja kesti kauan aikaa heittää toistuvasti, että tiedoston nimi oli liian pitkä.

Windows-käyttöjärjestelmässä yhden tiedostonimen pituusraja on 255 ja koko polun pituus (kuten E: abc test.doc) on rajoitettu 260: een, ja kiinalainen merkki vie 2 merkkiä.

Polku päättyy merkkijonolla ' 0' yhden merkin ottamiseksi, joten koko polun todellinen raja on 259.