Mari kita mulai dengan sebuah ide. Katakanlah Anda, sebagai auditor sungguhan, ingin melakukan pemeriksaan terhadap pelaporan peternak anjing, menggunakan, antara lain, sumber daya pihak ketiga. Untuk melakukan ini, Anda mencoba untuk mendapatkan informasi sistematis tentang anak anjing breeder, mengetahui, misalnya, hanya nama ras mereka, dan membuat tabel darinya di Pandas, cocok untuk pemrosesan lebih lanjut dalam bentuk apa pun (semua jenis penelitian statistik, agregasi, dan sebagainya). Tetapi data Anda disimpan jauh di dalam beberapa situs abstrak, dari mana Anda dapat mengeluarkannya hanya dalam bentuk arsip, tempat dokumen dari beberapa format ditumpuk, di dalamnya terdapat teks, gambar, tabel. Dan jika ada banyak ras anakan, dan untuk masing-masing ada lusinan file pdf dengan tabel, di mana Anda tidak memerlukan semua informasi, dan juga, misalnya, apakah Anda memerlukan nama tabel atau catatan kaki ini? Mari tambahkan beberapa fungsi ke proyek kita,menyelesaikan tugas-tugas berikut: membongkar dan membongkar arsip dengan data, mencari dan memproses file pdf dari arsip, menganalisis data yang diterima.
Pertama, mari impor semua yang kita butuhkan. Mari bagi perpustakaan yang kita butuhkan menjadi perpustakaan sistem:
import os
import re
import glob
import csv
import shutil
dan yang eksternal yang membutuhkan instalasi (pip install, seperti yang saya katakan):
import requests as req
import pandas as pd
from zipfile import ZipFile
import tabula
import PyPDF2
from pdf2image import convert_from_path
from pytesseract import image_to_string
from PIL import Image, ImageDraw
Sekarang, untuk setiap anak anjing Anda, kami akan mengunduh arsip besar dengan data, merujuk ke situs dengan nama rasnya:
def get_doquments_archive(breed):
url = 'https://yourwebsite' + breed + '/document/download'
with req.get(url, stream=True) as r:
r.raise_for_status()
with open('/Users/user/Desktop/' + breed + '.zip', 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
Kami sekarang memiliki arsip di desktop kami. Mari kita buka paketnya, untuk ini kita hanya perlu mengetahui jalur ke file dengan arsip:
def unzipper(zippath, cond = False):
dirpath = zippath[:-4] + '_package'
if os.path.exists(dirpath) and os.path.isdir(dirpath):
shutil.rmtree(dirpath)
os.mkdir(dirpath)
with ZipFile(zippath, 'r') as zipObj:
zipObj.extractall(path = dirpath)
Pada langkah ini, kita akan mendapatkan folder dengan dokumen, di mana pdf, csv, xls, png dan hal-hal bagus lainnya. Katakanlah kita ingin memproses beberapa file pdf yang berisi tabel dengan data. Tapi bagaimana cara mengeluarkan mereka dari sana? Pertama, mari pilih dokumen dengan format yang diperlukan dari folder:
all_pdfs = glob.glob(dirpath + '/*_pd*.pdf')
Luar biasa. Kami sekarang memiliki banyak file dengan teks dan tabel di dalamnya. Ketika mencoba untuk mengekstrak informasi dari sana, mungkin ternyata alat mengenali campuran semacam itu dengan sangat miring, terutama jika tabelnya direkatkan satu sama lain, dan judul atau catatan kaki mereka adalah teks yang terpisah. Tabula datang untuk menyelamatkan! Tapi pertama-tama, mari kita ambil dari halaman pertama setiap dokumen sedikit deskripsi tekstual yang tidak disertakan dalam tabel (teks semacam itu untuk tabula bisa menjadi masalah). Karena halaman pertama juga bisa memiliki tabel, mari gunakan fokus:
def get_text_description(path):
pdfFileObj = open(path,'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
pages = convert_from_path(declar, 0)
page = pages[0]
pname = '/Users/user/Desktop/text_description.png'
page.save(pname, 'JPEG')
text = image_to_string(Image.open('/Users/user/Desktop/text_description.png'),
lang = 'rus')
text_file = open('res', "w")
text_file.write(text)
text_file.close()
Sekarang mari kita mulai mengerjakan tabel. Jika Anda beruntung, dan tabel di pdf kami cukup dapat dibaca, tabula akan mengunggahnya dengan benar dalam format csv, jadi Anda bahkan tidak perlu mengurai informasinya:
tabula.convert_into(file, 'output_file.csv', output_format = "csv", pages = 'all')
Lihat bagaimana sekarang bisa mudah untuk mendapatkan, misalnya, data tentang karakter anak anjing yang dipilih:
data = pd.read_csv('/Users/user/Desktop/output_file.csv')
temperament = data[data[''] == '']['']
Tetapi bagaimana jika penulis teks menempelkan tabel, menambahkan jumlah kolom yang berbeda ke baris, atau mencampurnya dengan teks? Kemudian kami akan mengonversi file yang diterima dari tabula menjadi format baru:
def get_table_data(path):
data = []
with open(path) as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
for val in row.values():
data.append(val)
data = str(data)
data = re.sub('\]|\[|,|\'', '', data)
data = data.replace("\\n", "")
return data
Untuk apa? Ini akan memungkinkan Anda untuk mencari informasi yang Anda butuhkan dengan cepat dan tanpa rasa sakit menggunakan ekspresi reguler. Kami ingin menemukan satu set kemungkinan warna ras:
def get_colors(data):
res = re.search('^: (.*)', data).group(1)
return res
Sekarang kami telah mengumpulkan sejumlah informasi dari file satu per satu anak anjing (misalnya, karakter, warna, berat). Mari tambahkan ke dataframe pandas sebagai baris baru:
def append_new_row(dataframe, breed, temperament, colors, weight):
return dataframe.append({'': breed,
'': temperament,
'': colors,
'' : weight
}, ignore_index=True)
Apa yang kami miliki sekarang:
Jadi, kami membongkar arsip dengan data dari situs, membongkarnya, mengeluarkan dokumen yang kami butuhkan, mengekstrak informasi penting darinya, dan membawanya ke format yang nyaman. Sekarang data ini dapat dibandingkan dengan yang disediakan oleh perusahaan, diubah dan dianalisis, dan banyak lagi! Jauh lebih nyaman daripada mengunduh dan menulis secara manual.
def clean_all(path):
os.remove(path + '.zip')
shutil.rmtree(path + '_package')
Penting agar tindakan Anda tetap sepenuhnya legal. Anda dapat mengambil data dari situs, Anda tidak dapat mencuri konten. Anda dapat mengunduh secara otomatis, Anda tidak dapat menempatkan server. Pelajari hak cipta dan KUHP Federasi Rusia, tidak menyebabkan kerusakan.