Last week I had an interesting one come up. A friend who works admin at a local Fire Prevention company mentioned they had a new report format and they had hundreds of old documents that needed data moved into new documents with a new format. As the columns didn't line up exactly, they were having to futz around with the original table so they could manually copy-paste it into the new one. Even a small one with 5-10 entries would take nearly 5 minutes to integrate, and as we later discovered, some had upwards of *3000 entries* which could take a full day or more as the new document has space for only 20 entries per page so would require a bunch of new pages added. And there were over 700 of these reports. My pal was belly-aching about how the boss wanted them to go through and prepare all these report templates ahead of time manually. They'd have to set aside at least two weeks for two people to sit there doing this most tedious of tasks until their **eyes would bulge out of their head**, leaving their face a **smoking ruin** with **eyeball-goop dripping out of the empty sockets**. <br>  <br> Well needless to say, they were really bummed because they had a ton of other work they needed to be doing, and could not imagine just dropping everything for the time it would take to get this task done. Knowing the kind of work I do, they asked me the golden question, *"Can you automate this?"* ***Yes, yes, I can.*** They talked to their boss, and then got back to me immediately asking for a quote. I quickly scribbled something out and two days later I had a USB with hundreds of documents on it and a copy of the new 15 page blank report template. <br> # Break It Down Contract secured, I was ready to pull up my sleeves and take a peek. As with any problem, the first thing you need to do is break it down into simpler steps. After taking a look at the old documents (each was a list of devices, ie fire alarm pull stations, smoke alarms and their circuits) and the new report template, I determined what I would need my code to do: 1. ***Load** a folder of docx documents* 2. ***Loop** through each file and extract the filename and relevant data* 3. ***Insert** the data into the proper place in a blank template* 4. ***Output** a new properly named file with the old data on the new template* Because of the sheer number of documents and some inconsistencies in the file naming, I decided that I would handle this in two stages; an ***Input Stage*** where I would extract and sanitize the data/filename from each docx and write those to individual .csv files, and an ***Output Stage*** where I would merge the .csv data into a new template and save it with a proper filename. <br> # Why Python? Python is perfect for one-shot programs. We don't need to create a permanent piece of software with any bells or whistles, so while Java, C++ and C# are also great choices for working with external libraries and the filesystem, nothing is going to beat Python here for implementation speed. Now, if I wanted to make this an actual import and merging program for the general public or was optimising for run speed, I'd absolutely be picking C++ or C#, but since I'm essentially running this once, I just need to launch this from the Command Line and watch it spit out my files. Javascript is also a decent choice for one-shot scripts, especially if you're going to share the script -- a one-shot .js script can be run by anyone with a browser, whereas you need to have Python installed to run a .py script. Since I already have Python installed, and intended to be the only one running the script, this was a no-brainer. > ***SIDE NOTE**: If you've never used Python before and are interested in learning it, I can't recommend Al Sweigart's [Automate the Boring Stuff with Python](https://automatetheboringstuff.com/) book nearly enough. While it has a well deserved reputation as a great starting point for people who have never programmed anything before, it moves along quickly enough that experienced non-python programmers can get up to speed very rapidly as well. It's been years, but as I recall one of the first lessons had you pulling specific data from individual emails from an outlook mailbox file in under ten lines of code, instantly demonstrating the kind of power Python allows you to wield.* <br> # Input Stage First things first, we need to assess the original document and see what we're dealing with. Here's a made-up example for a file called "*7777 Wizard Crescent - Device Location Sheet 2024.docx*":  <br> After this table there are a series of other tables, with legends for the columns, appropriate fire codes and such... but everything we need to extract is on this first table (or tables). This example is just a tiny shop with 4 pull stations and 2 bells, but when you get into bigger sites like hospitals, schools, malls and residential towers, you're easily looking at dozens or hundreds of devices. Thankfully those other tables were all only 3-4 columns, so I knew that if I scanned the document and found a 9 column table, it would have information I need. So lets create a new document called FetchData.py in a new folder, and open it in our favorite IDE. We know we'll need to *read the file system*, we'll need to *read the document*, we'll need to *sanitize the file names* and we'll need to *output csvs*. So we need some **imports**, and since we want to keep things organized we're going to establish a couple folders: ```python import os import docx import re import csv input_folder = "./source" output_folder = "./processed" ``` - **import os** gives us access to the Operating System to read a directory and see all the files in it - **import docx** gives us the ability to read and manipulate Word(docx) files. - **import re** for Regex so we can clean up the filenames; some say Device Location Sheets, some just say Device Sheet etc. and most have a year attached which we don't need. - **import csv** gives us the ability to read and write .csv *(comma separated value)*. and then **source** and **processed** will contain our original files and our pared-down .csv files containing just the extracted data. <br> Next we need a function to find the relevant table(s) in our document, and grab our data. In our case we just need the Location (column 0), the Device Type (column 1) and the Circuit Address (column 6). Additionally, some files have an extra third column with additional information, in that case we're looking for tables with 10 columns, and Circuit Address on column 7 instead: ```python def extract_table_data(doc_path): doc = docx.Document(doc_path) extracted_data = [] for table in doc.tables: for row_index, row in enumerate(table.rows): cells = [cell.text.strip() for cell in row.cells] if len(cells) in [9, 10]: # Check for 9 or 10 columns if row_index == 0 and cells[0].lower() == "location": # Skip header row continue location = cells[0] device = cells[1] circuit = cells[6] if len(cells) == 9 else cells[7] if any([location, device, circuit]): # Only keep rows with data extracted_data.append([location, device, circuit]) return extracted_data ``` If we find a row with "location" in it, we want to skip that since it's just a legend row, and we're also removing any blank rows we encounter to minimize page count on our final reports. <br> Now we need a function to convert the filename *7777 Wizard Crescent - Device Location Sheet 2024.docx* to a new filename, al la *777 Wizard Crescent - Device Data.csv*. ```python def sanitize_filename(filename): # Normalize all "Device Location" variations to "Device Data" filename = re.sub(r"(?i)device locations?( sheets?)?", "Device Data", filename) # Remove specific year patterns with a leading space for year in [" 2022", " 2023", " 2024", " 2025"]: filename = filename.replace(year, "") # Ensure proper extension return filename.replace(".docx", ".csv") ``` <br> and finally a function to run those two functions in a loop over the entire contents of our *source* folder: ```python def process_folder(input_folder, output_folder): if not os.path.exists(output_folder): os.makedirs(output_folder) for filename in os.listdir(input_folder): if filename.lower().endswith(".docx"): doc_path = os.path.join(input_folder, filename) extracted_data = extract_table_data(doc_path) new_filename = sanitize_filename(filename) csv_path = os.path.join(output_folder, new_filename) with open(csv_path, "w", newline="", encoding="utf-8") as csvfile: csv_writer = csv.writer(csvfile, quoting=csv.QUOTE_ALL) csv_writer.writerows(extracted_data) print(f"Processed: {filename} -> {new_filename}") ``` <br> Now we simply need one last command to run the process and we're gravy: ```python process_folder(input_folder, output_folder) ``` Voila! We save our script, make a folder called ***source*** and populate it with documents, and drop to command line to run *python3 FetchData.py*. This leaves us with a nice folder full of 3-column .csv files containing the three bits of data we need to import to their new templates!  <br> # Output Stage This has gotten quite a bit longer than I expected, so I think I'm going to leave it at that for now. Tune in [next week](https://peakd.com/hive-169321/@coderad/how-i-saved-100s-of-hours-of-work-for-a-local-company-using-python-and-python-docx-n00b-friendly-part-22), and I'll run through the second half of the process where we build out our templates and merge our data with a new script, *MergeData.py*. We'll be dealing with a bunch of edge cases, inconsistent file names and a couple dead end experiments, so should be a real ride. In the meantime, feel free to hit me with any questions about this in the comments below. And ofc, if you ever need any of this type of work done to save your sanity or the sanity of your family, friends or co-workers, you can always reach out directly to me at *coderaddesign[dot]gmail.com* or by DM to *Scarflax#8455* on Discord.
author | coderad | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
permlink | how-i-saved-100s-of-hours-of-work-for-a-local-company-using-python-and-python-docx-n00b-friendly-part-12 | ||||||||||||||||||||||||
category | hive-169321 | ||||||||||||||||||||||||
json_metadata | {"app":"peakd/2025.3.5","format":"markdown","image":["https://files.peakd.com/file/peakd-hive/coderad/Eo6Apn6Z6zC92Ri4Jouw4P33riwzpYYPHMvEWDwjpoykh6kPPqQvCZF7e5wNmerf1Gn.png","https://files.peakd.com/file/peakd-hive/coderad/Eo1vTqKn7HkQJS8Ee1roNnpL5Uc23Bb6HumAsqiHJb3ysMtfLCftd9sbBAB3HjatYtr.png","https://files.peakd.com/file/peakd-hive/coderad/23uQNa6vbjzUXv5aAmkZVxYRsBJiGYnGpUBvQEjC8THgxhuGWcpV8VWdcRhkceFr7vrKb.png"],"tags":["programming","automation","development","word","docx","filesystem","csv","python","beginner"],"users":["coderad"]} | ||||||||||||||||||||||||
created | 2025-03-25 21:25:57 | ||||||||||||||||||||||||
last_update | 2025-05-08 15:53:06 | ||||||||||||||||||||||||
depth | 0 | ||||||||||||||||||||||||
children | 3 | ||||||||||||||||||||||||
last_payout | 2025-04-01 21:25:57 | ||||||||||||||||||||||||
cashout_time | 1969-12-31 23:59:59 | ||||||||||||||||||||||||
total_payout_value | 7.718 HBD | ||||||||||||||||||||||||
curator_payout_value | 8.250 HBD | ||||||||||||||||||||||||
pending_payout_value | 0.000 HBD | ||||||||||||||||||||||||
promoted | 0.000 HBD | ||||||||||||||||||||||||
body_length | 10,813 | ||||||||||||||||||||||||
author_reputation | 18,083,391,714,930 | ||||||||||||||||||||||||
root_title | "How I saved 100s of hours of work for a local company using Python and python-docx (N00B Friendly) [Part 1/2]." | ||||||||||||||||||||||||
beneficiaries |
| ||||||||||||||||||||||||
max_accepted_payout | 1,000,000.000 HBD | ||||||||||||||||||||||||
percent_hbd | 10,000 | ||||||||||||||||||||||||
post_id | 141,677,753 | ||||||||||||||||||||||||
net_rshares | 49,622,926,289,242 | ||||||||||||||||||||||||
author_curate_reward | "" |
voter | weight | wgt% | rshares | pct | time |
---|---|---|---|---|---|
kevinwong | 0 | 1,227,847,070 | 0.6% | ||
eric-boucher | 0 | 3,410,751,565 | 0.6% | ||
roelandp | 0 | 4,775,799,568 | 0.37% | ||
matt-a | 0 | 567,841,947 | 6.98% | ||
jacor | 0 | 5,763,716,669 | 10.5% | ||
cloh76 | 0 | 819,692,762 | 0.6% | ||
jeffjagoe | 0 | 1,103,947,164 | 1.05% | ||
fiveboringgames | 0 | 1,303,898,734 | 21% | ||
lemouth | 0 | 309,748,305,979 | 10% | ||
tfeldman | 0 | 1,132,040,966 | 0.6% | ||
ebargains | 0 | 5,511,370,336 | 19.95% | ||
metabs | 0 | 1,142,497,422 | 10% | ||
mcsvi | 0 | 116,025,921,440 | 50% | ||
boxcarblue | 0 | 3,490,467,573 | 0.6% | ||
justyy | 0 | 9,205,047,315 | 1.2% | ||
michelle.gent | 0 | 735,318,390 | 0.24% | ||
curie | 0 | 69,047,914,504 | 1.2% | ||
modernzorker | 0 | 715,668,381 | 0.84% | ||
techslut | 0 | 26,841,324,534 | 4% | ||
alexisvalera | 0 | 1,320,451,430 | 10.5% | ||
discovereurovelo | 0 | 1,199,147,551 | 0.75% | ||
steemstem | 0 | 184,015,063,801 | 10% | ||
oleg326756 | 0 | 2,094,370,244 | 5.25% | ||
yadamaniart | 0 | 17,350,788,453 | 10.5% | ||
justinw | 0 | 34,947,577,375 | 6.58% | ||
walterjay | 0 | 157,655,133,862 | 6.3% | ||
valth | 0 | 853,431,051 | 5% | ||
metroair | 0 | 5,945,455,403 | 1.2% | ||
askari | 0 | 3,962,239,031 | 21% | ||
driptorchpress | 0 | 464,569,385 | 0.3% | ||
amariespeaks | 0 | 964,052,507 | 7.98% | ||
dna-replication | 0 | 343,569,317 | 10% | ||
torkot | 0 | 3,600,811,604 | 10.5% | ||
fronttowardenemy | 0 | 4,223,517,469 | 1.5% | ||
dhimmel | 0 | 9,906,385,977 | 2.5% | ||
detlev | 0 | 76,120,886,370 | 3.15% | ||
lizanomadsoul | 0 | 3,187,457,750 | 1.5% | ||
ma1neevent | 0 | 19,918,904,133 | 15% | ||
batman0916 | 0 | 1,889,195,294 | 9.97% | ||
gamersclassified | 0 | 1,065,544,618 | 0.6% | ||
clacrax | 0 | 534,530,543 | 10.5% | ||
mobbs | 0 | 32,853,282,733 | 10% | ||
eliel | 0 | 875,367,792 | 1.2% | ||
jerrybanfield | 0 | 4,067,170,131 | 1.2% | ||
rt395 | 0 | 1,850,867,524 | 2.5% | ||
bitrocker2020 | 0 | 1,716,208,393 | 0.24% | ||
ohamdache | 0 | 749,348,597 | 0.6% | ||
newsflash | 0 | 4,997,145,815 | 15.75% | ||
arunava | 0 | 3,286,521,488 | 0.48% | ||
rawselectmusic | 0 | 4,203,898,504 | 10.5% | ||
juancar347 | 0 | 84,038,390,297 | 10.5% | ||
enjar | 0 | 12,750,627,570 | 1.08% | ||
lorenzor | 0 | 1,308,941,489 | 50% | ||
alexander.alexis | 0 | 6,051,966,235 | 10% | ||
dandesign86 | 0 | 829,303,716 | 0.39% | ||
jayna | 0 | 1,781,980,946 | 0.24% | ||
guchtere | 0 | 1,184,999,067 | 9.97% | ||
princessmewmew | 0 | 1,558,760,629 | 0.6% | ||
joeyarnoldvn | 0 | 454,430,426 | 1.47% | ||
decomoescribir | 0 | 3,512,248,331 | 10.5% | ||
gunthertopp | 0 | 12,008,616,758 | 0.24% | ||
empath | 0 | 1,641,074,397 | 1.02% | ||
diegoameerali | 0 | 1,124,115,209 | 6.3% | ||
minnowbooster | 0 | 806,689,764,610 | 20% | ||
felt.buzz | 0 | 1,732,437,250 | 0.3% | ||
howo | 0 | 368,575,432,283 | 21% | ||
tsoldovieri | 0 | 1,033,153,436 | 5% | ||
abnerpantoja | 0 | 1,026,088,340 | 10.5% | ||
neumannsalva | 0 | 1,097,719,603 | 0.6% | ||
owner99 | 0 | 704,754,240 | 10.5% | ||
stayoutoftherz | 0 | 39,226,245,850 | 0.3% | ||
abigail-dantes | 0 | 3,814,842,808 | 10% | ||
coindevil | 0 | 644,932,884 | 0.96% | ||
cranium | 0 | 112,451,424 | 1.5% | ||
ocd | 0 | 1,696,420,825,219 | 21% | ||
investingpennies | 0 | 3,645,673,298 | 1.2% | ||
kharrazi | 0 | 739,721,982 | 21% | ||
iamphysical | 0 | 14,646,801,900 | 90% | ||
zyx066 | 0 | 9,143,046,104 | 6.3% | ||
etblink | 0 | 5,469,415,265 | 0.52% | ||
azulear | 0 | 577,312,435 | 100% | ||
psicoluigi | 0 | 811,469,046 | 50% | ||
rocky1 | 0 | 173,131,941,625 | 0.18% | ||
kimzwarch | 0 | 16,103,462,927 | 4% | ||
niallon11 | 0 | 6,257,644,411 | 5.25% | ||
kaizag | 0 | 577,651,039 | 10.5% | ||
aidefr | 0 | 1,056,818,820 | 5% | ||
estream.studios | 0 | 922,400,054 | 19.95% | ||
drax | 0 | 13,354,291,179 | 2.52% | ||
cesinfenianos | 0 | 1,004,491,369 | 10.5% | ||
jlsplatts | 0 | 26,117,444,647 | 2% | ||
dauerossi | 0 | 6,952,518,477 | 30% | ||
meno | 0 | 12,623,289,157 | 0.6% | ||
buttcoins | 0 | 7,483,685,014 | 0.24% | ||
enzor | 0 | 562,717,279 | 10% | ||
bartosz546 | 0 | 525,014,720 | 0.6% | ||
petrolinivideo | 0 | 611,574,248 | 7.87% | ||
sunsea | 0 | 1,577,705,006 | 0.6% | ||
eonwarped | 0 | 14,595,866,513 | 6.3% | ||
emrebeyler | 0 | 136,474,063,231 | 2.1% | ||
bluefinstudios | 0 | 989,609,237 | 0.36% | ||
steveconnor | 0 | 1,120,879,822 | 0.6% | ||
xsasj | 0 | 2,208,958,549 | 1.5% | ||
aboutcoolscience | 0 | 2,729,043,873 | 10% | ||
anli | 0 | 3,397,949,625 | 21% | ||
kernelillo | 0 | 574,073,405 | 10.5% | ||
itchyfeetdonica | 0 | 5,826,090,525 | 0.75% | ||
kenadis | 0 | 2,655,804,806 | 10% | ||
madridbg | 0 | 2,266,782,031 | 10% | ||
iaberius | 0 | 541,273,410 | 10.5% | ||
robotics101 | 0 | 3,117,106,091 | 10% | ||
tomatom | 0 | 2,121,559,366 | 10.5% | ||
adelepazani | 0 | 12,451,847,771 | 4.2% | ||
sco | 0 | 2,970,566,858 | 10% | ||
ennyta | 0 | 957,658,612 | 50% | ||
juecoree | 0 | 975,326,984 | 10.5% | ||
carsonroscoe | 0 | 21,707,089,424 | 10.5% | ||
adncabrera | 0 | 647,333,308 | 3.15% | ||
azmielbanjary | 0 | 654,386,718 | 10.5% | ||
gabrielatravels | 0 | 15,871,649,032 | 8.4% | ||
hetty-rowan | 0 | 1,143,605,864 | 0.6% | ||
ydavgonzalez | 0 | 3,561,097,548 | 10% | ||
intrepidphotos | 0 | 2,713,328,982 | 7.5% | ||
fineartnow | 0 | 891,638,649 | 0.6% | ||
aiziqi | 0 | 1,094,283,447 | 5% | ||
steemvault | 0 | 486,685,324 | 1.2% | ||
communitybank | 0 | 835,017,909 | 1.2% | ||
utube | 0 | 849,007,751 | 1.2% | ||
davemccoy | 0 | 3,916,449,696 | 19.95% | ||
mciszczon | 0 | 2,262,558,144 | 10.5% | ||
manncpt | 0 | 3,337,530,250 | 1.5% | ||
m1alsan | 0 | 482,493,302 | 0.48% | ||
ricardo993 | 0 | 2,496,813,340 | 12.6% | ||
dynamicrypto | 0 | 497,558,951 | 0.75% | ||
auracraft | 0 | 586,665,576 | 19.95% | ||
neneandy | 0 | 1,349,934,190 | 1.2% | ||
marc-allaria | 0 | 491,229,258 | 0.6% | ||
jnmarteau | 0 | 665,071,751 | 1.5% | ||
sportscontest | 0 | 1,212,692,734 | 1.2% | ||
pandasquad | 0 | 3,485,710,620 | 1.2% | ||
debilog | 0 | 533,106,834 | 10.5% | ||
miguelangel2801 | 0 | 768,064,482 | 50% | ||
mproxima | 0 | 514,687,376 | 0.6% | ||
fantasycrypto | 0 | 855,556,933 | 1.2% | ||
ocd-witness | 0 | 129,467,731,533 | 21% | ||
emiliomoron | 0 | 888,336,329 | 5% | ||
photohunt | 0 | 695,037,703 | 1.2% | ||
geopolis | 0 | 620,793,808 | 10% | ||
robertbira | 0 | 1,039,206,855 | 2.5% | ||
alexdory | 0 | 1,746,100,395 | 10% | ||
takowi | 0 | 24,944,896,501 | 1.2% | ||
cyprianj | 0 | 2,561,357,416 | 5% | ||
melvin7 | 0 | 17,501,928,647 | 5% | ||
francostem | 0 | 1,339,242,821 | 10% | ||
endopediatria | 0 | 687,416,599 | 20% | ||
croctopus | 0 | 1,452,307,498 | 100% | ||
jjerryhan | 0 | 1,505,000,393 | 0.6% | ||
putu300 | 0 | 945,592,573 | 5% | ||
zipporah | 0 | 582,314,419 | 0.24% | ||
superlotto | 0 | 1,210,527,080 | 1.2% | ||
bscrypto | 0 | 3,525,361,235 | 0.6% | ||
tomastonyperez | 0 | 16,534,693,121 | 50% | ||
bil.prag | 0 | 518,996,944 | 0.06% | ||
vcclothing | 0 | 600,496,305 | 0.36% | ||
elvigia | 0 | 10,767,976,792 | 50% | ||
sanderjansenart | 0 | 48,241,735,884 | 21% | ||
qberry | 0 | 903,437,551 | 0.6% | ||
greddyforce | 0 | 876,048,560 | 0.44% | ||
gadrian | 0 | 76,815,463,132 | 6% | ||
therising | 0 | 22,812,634,597 | 1.2% | ||
cryptocoinkb | 0 | 459,374,788 | 0.6% | ||
de-stem | 0 | 5,436,477,755 | 9.9% | ||
imcore | 0 | 867,679,324 | 10% | ||
josedelacruz | 0 | 4,932,118,778 | 50% | ||
achimmertens | 0 | 36,647,493,556 | 10.5% | ||
kgakakillerg | 0 | 21,583,181,692 | 10% | ||
ybf | 0 | 592,799,238 | 10.5% | ||
softa | 0 | 884,350,631 | 0.24% | ||
el-dee-are-es | 0 | 3,675,547,128 | 10% | ||
erickyoussif | 0 | 627,052,518 | 100% | ||
indigoocean | 0 | 5,115,373,439 | 10.5% | ||
deholt | 0 | 532,799,586 | 8.5% | ||
veteranforcrypto | 0 | 1,331,712,169 | 6.3% | ||
friendsofgondor | 0 | 78,243,855,748 | 19.95% | ||
steem.services | 0 | 20,585,072,065 | 19.95% | ||
pladozero | 0 | 11,606,595,040 | 10% | ||
minerthreat | 0 | 897,665,519 | 0.6% | ||
nateaguila | 0 | 71,368,712,746 | 5% | ||
crypticat | 0 | 2,481,650,853 | 0.75% | ||
temitayo-pelumi | 0 | 930,729,028 | 10% | ||
andrick | 0 | 835,201,781 | 50% | ||
doctor-cog-diss | 0 | 9,170,365,769 | 10% | ||
musicvoter2 | 0 | 715,095,542 | 1% | ||
acont | 0 | 1,548,760,762 | 50% | ||
uche-nna | 0 | 1,107,233,446 | 0.96% | ||
corinadiaz | 0 | 577,216,638 | 9.97% | ||
konradxxx3 | 0 | 1,219,610,017 | 10.5% | ||
haccolong | 0 | 1,292,031,039 | 10.5% | ||
cheese4ead | 0 | 940,011,278 | 0.6% | ||
gaottantacinque | 0 | 0 | 100% | ||
nattybongo | 0 | 3,736,291,449 | 10% | ||
talentclub | 0 | 14,295,934,804 | 10.5% | ||
ocdb | 0 | 41,350,086,234,146 | 19.95% | ||
armandosodano | 0 | 1,205,861,739 | 0.6% | ||
jesusmedit | 0 | 615,081,167 | 14.7% | ||
gerdtrudroepke | 0 | 12,929,766,283 | 7% | ||
goblinknackers | 0 | 82,475,548,005 | 7% | ||
reinaseq | 0 | 8,180,709,701 | 100% | ||
hoaithu | 0 | 3,416,292,663 | 8.92% | ||
kylealex | 0 | 5,138,316,813 | 10% | ||
gasaeightyfive | 0 | 557,979,633 | 100% | ||
anhvu | 0 | 2,123,674,995 | 8.4% | ||
fran.frey | 0 | 4,069,452,488 | 50% | ||
rayshiuimages | 0 | 844,827,939 | 10.5% | ||
pradeepdee6 | 0 | 2,352,847,227 | 8.4% | ||
pboulet | 0 | 16,941,281,897 | 8% | ||
javyeslava.photo | 0 | 3,382,923,153 | 12.6% | ||
marcocasario | 0 | 70,600,576,805 | 11.57% | ||
stem-espanol | 0 | 2,428,543,205 | 100% | ||
cribbio | 0 | 1,954,517,219 | 100% | ||
cliffagreen | 0 | 5,065,590,812 | 10% | ||
aleestra | 0 | 15,858,644,870 | 80% | ||
the.success.club | 0 | 760,196,270 | 0.6% | ||
merlin7 | 0 | 1,628,768,456 | 0.84% | ||
giulyfarci52 | 0 | 1,662,655,043 | 50% | ||
kristall97 | 0 | 708,096,899 | 100% | ||
steemcryptosicko | 0 | 1,980,530,581 | 0.24% | ||
multifacetas | 0 | 14,166,023,469 | 10.5% | ||
cakemonster | 0 | 621,917,423 | 1.2% | ||
stem.witness | 0 | 565,099,751 | 10% | ||
variedades | 0 | 2,864,008,807 | 7.98% | ||
kennybobs | 0 | 977,080,539 | 19.95% | ||
jacuzzi | 0 | 1,170,020,113 | 2.62% | ||
steemstorage | 0 | 1,522,416,983 | 1.2% | ||
aqua.nano | 0 | 522,841,479 | 100% | ||
crowdwitness | 0 | 1,980,496,423 | 5% | ||
hairgistix | 0 | 698,101,165 | 0.6% | ||
rem-steem | 0 | 2,069,866,177 | 0.6% | ||
instagram-models | 0 | 3,004,701,006 | 0.6% | ||
hozn4ukhlytriwc | 0 | 1,254,540,114 | 10% | ||
steemean | 0 | 10,089,421,324 | 5% | ||
littlesorceress | 0 | 1,208,910,066 | 1.2% | ||
newton666 | 0 | 644,520,128 | 100% | ||
cryptofiloz | 0 | 1,912,802,166 | 1.2% | ||
squareonefarms | 0 | 2,185,949,395 | 10.5% | ||
beerlover | 0 | 4,276,181,790 | 3.15% | ||
qwerrie | 0 | 22,820,345,555 | 1.57% | ||
shookt | 0 | 1,094,834,546 | 10.5% | ||
kgswallet | 0 | 523,823,777 | 9.97% | ||
reggaesteem | 0 | 503,754,938 | 5% | ||
capp | 0 | 14,072,321,895 | 50% | ||
beta500 | 0 | 850,488,217 | 1.2% | ||
steemstem-trig | 0 | 163,292,136 | 10% | ||
baltai | 0 | 1,448,608,175 | 0.6% | ||
chris-uk | 0 | 3,442,762,158 | 10.5% | ||
kaeserotor | 0 | 2,767,678,717 | 14.7% | ||
ibt-survival | 0 | 42,210,913,515 | 10% | ||
bilpcoinbpc | 0 | 880,982,689 | 5% | ||
keys-defender | 0 | 1,944,420,036 | 100% | ||
nerdvana | 0 | 1,441,550,401 | 10.5% | ||
dpend.active | 0 | 1,578,711,591 | 4.2% | ||
hive-199963 | 0 | 1,331,447,729 | 1.2% | ||
monica-ene | 0 | 466,386,998 | 0.6% | ||
hivebuzz | 0 | 11,746,671,397 | 3% | ||
pinmapple | 0 | 856,195,512 | 1.5% | ||
stemsocial | 0 | 82,190,642,686 | 10% | ||
the100 | 0 | 38,217,649,408 | 21% | ||
kiemurainen | 0 | 1,705,762,210 | 0.5% | ||
iameden | 0 | 941,459,015 | 10.5% | ||
evelynchacin | 0 | 6,472,661,156 | 10.5% | ||
noelyss | 0 | 1,984,581,470 | 5% | ||
forkyishere | 0 | 9,340,469,363 | 5.25% | ||
balvinder294 | 0 | 2,440,814,480 | 20% | ||
millycf1976 | 0 | 46,009,567,539 | 10.5% | ||
sidjay | 0 | 520,375,449 | 10.5% | ||
gabilan55 | 0 | 1,585,537,281 | 10.5% | ||
perceval | 0 | 1,021,038,074 | 21% | ||
anafae | 0 | 1,561,044,483 | 2.1% | ||
scriptkittie | 0 | 1,644,848,927 | 21% | ||
goliathus | 0 | 1,759,075,804 | 21% | ||
kei2 | 0 | 575,184,768 | 10.5% | ||
trangbaby | 0 | 6,031,545,206 | 19.95% | ||
altleft | 0 | 5,411,769,901 | 0.01% | ||
omarrojas | 0 | 427,324,316 | 0.6% | ||
evagavilan2 | 0 | 3,366,528,042 | 5.25% | ||
paolazun | 0 | 1,377,989,086 | 10.5% | ||
lockedd | 0 | 664,082,787 | 10.5% | ||
dhedge | 0 | 22,257,609,780 | 4.2% | ||
meritocracy | 0 | 1,370,753,704,795 | 9.97% | ||
pepeymeli | 0 | 766,966,115 | 50% | ||
hiveart | 0 | 910,929,611 | 10.5% | ||
dcrops | 0 | 100,221,990,047 | 10.5% | ||
cielitorojo | 0 | 8,315,114,895 | 13.96% | ||
babeltrips | 0 | 4,926,104,040 | 9.97% | ||
cescajove | 0 | 3,281,382,696 | 10.5% | ||
whywhy | 0 | 502,980,513 | 0.33% | ||
yozen | 0 | 1,680,892,352 | 0.6% | ||
solymi | 0 | 104,935,043,034 | 10.5% | ||
tikki00taffi | 0 | 949,070,661 | 52% | ||
tawadak24 | 0 | 17,041,291,488 | 10.5% | ||
hive-152524 | 0 | 584,291,543 | 10.5% | ||
elgatoshawua | 0 | 2,802,582,751 | 9.97% | ||
nyxlabs | 0 | 1,446,220,036 | 5% | ||
dodovietnam | 0 | 1,827,697,105 | 9.97% | ||
failingforwards | 0 | 717,681,858 | 0.6% | ||
creodas | 0 | 473,753,962 | 14.96% | ||
drricksanchez | 0 | 3,475,570,495 | 0.6% | ||
hexagono6 | 0 | 1,503,929,930 | 9.97% | ||
khushboo108 | 0 | 1,396,496,809 | 10.5% | ||
nfttunz | 0 | 2,058,371,404 | 0.12% | ||
hive-defender | 0 | 333,477,440 | 100% | ||
mahuampionlinemg | 0 | 523,020,857 | 21% | ||
okluvmee | 0 | 793,668,391 | 0.6% | ||
atexoras.pub | 0 | 6,057,267,761 | 10.5% | ||
merit.ahama | 0 | 964,136,993 | 0.36% | ||
holovision.cash | 0 | 4,325,322,678 | 100% | ||
brujita18 | 0 | 3,547,402,829 | 10.5% | ||
iamchuks | 0 | 565,118,477 | 10.5% | ||
partiesjohall | 0 | 4,110,831,816 | 21% | ||
josdelmi | 0 | 2,174,459,039 | 10.5% | ||
aprasad2325 | 0 | 3,736,396,937 | 9.97% | ||
koyel | 0 | 541,414,610 | 9.97% | ||
bokica80 | 0 | 488,340,689 | 5.25% | ||
bobreza | 0 | 501,849,126 | 10.5% | ||
ivycrafts | 0 | 8,012,747,925 | 10.5% | ||
thu172 | 0 | 514,191,795 | 19.95% | ||
seinkalar | 0 | 3,208,766,236 | 1.2% | ||
wazza84 | 0 | 825,021,487 | 21% | ||
aries90 | 0 | 10,548,619,536 | 1.2% | ||
princekham | 0 | 71,309,450,259 | 10.5% | ||
blingit | 0 | 15,424,923,593 | 10.5% | ||
iradeorum | 0 | 538,513,534 | 100% | ||
lynnnguyen | 0 | 1,460,402,282 | 19.95% | ||
kimloan | 0 | 1,529,167,050 | 9.97% | ||
winnietran | 0 | 832,392,630 | 9.97% | ||
dora381 | 0 | 7,493,921,626 | 19.95% | ||
sephiwolf | 0 | 1,536,143,847 | 18.9% | ||
mariamor785 | 0 | 1,534,897,353 | 10.5% | ||
churchoftheway | 0 | 566,074,775 | 21% | ||
h3m4n7 | 0 | 5,333,415,251 | 15.75% | ||
tonton23 | 0 | 621,260,090 | 10.5% | ||
madame-cyntaia | 0 | 583,692,551 | 5.98% | ||
psyberx | 0 | 2,415,739,000 | 1% | ||
yixn | 0 | 2,099,650,789 | 0.6% | ||
sunnyvo | 0 | 574,381,406 | 9.97% | ||
hyhy93 | 0 | 1,041,473,585 | 19.95% | ||
crypto-shots | 0 | 48,407,899 | 50% | ||
newilluminati | 0 | 3,548,776,092 | 0.6% | ||
tristan.todd | 0 | 1,358,666,060 | 21% | ||
vickoly | 0 | 737,231,149 | 0.6% | ||
alexmag1988 | 0 | 767,859,256 | 21% | ||
ivypham | 0 | 3,519,468,405 | 19.95% | ||
vindiesel1980 | 0 | 320,873,118 | 10.5% | ||
liveofdalla | 0 | 9,962,726,511 | 10.5% | ||
lukasbachofner | 0 | 18,773,320,534 | 10.5% | ||
allentaylor | 0 | 4,259,861,937 | 8.4% | ||
sam9999 | 0 | 458,408,686 | 5% | ||
alex2alex | 0 | 479,716,281 | 3.99% | ||
mario89 | 0 | 3,450,080,950 | 11.97% | ||
jerusa777 | 0 | 1,810,588,573 | 21% | ||
kheldar1982 | 0 | 46,086,369,800 | 19.95% | ||
us3incanada | 0 | 407,434,194 | 10.5% | ||
dlizara | 0 | 858,527,871 | 10.5% | ||
cryptoshots.nft | 0 | 0 | 100% | ||
njclabaugh | 0 | 454,397,012 | 100% | ||
pgm-curator | 0 | 3,774,959,021 | 10.5% | ||
marlasinger666 | 0 | 804,860,338 | 19.95% | ||
karizma | 0 | 632,811,815 | 1.99% | ||
belug | 0 | 1,538,906,702 | 0.36% | ||
gamemapmaker | 0 | 513,339,917 | 21% | ||
ersusoficial | 0 | 466,564,883 | 21% | ||
aletoalonewolf | 0 | 1,039,122,474 | 10.5% | ||
creativepixie | 0 | 950,321,639 | 10.5% | ||
castri-ja | 0 | 859,782,697 | 5.25% | ||
cryptoshots.play | 0 | 0 | 10% | ||
hk-curation | 0 | 1,106,129,519 | 0.84% | ||
acgalarza | 0 | 1,392,235,135 | 0.36% | ||
inibless | 0 | 1,111,195,649 | 5% | ||
myegoandmyself | 0 | 162,650,213,643 | 8% | ||
itadori-yuji | 0 | 1,112,938,417 | 21% | ||
etselec23 | 0 | 454,403,791 | 10.5% | ||
itsmikyhere | 0 | 462,238,184 | 0.75% | ||
callmesmile | 0 | 688,820,117 | 0.6% | ||
oasiskp2 | 0 | 1,677,173,467 | 9.97% | ||
jijisaurart | 0 | 509,646,029 | 0.6% | ||
cryptoshotsdoom | 0 | 0 | 10% | ||
tuba777 | 0 | 457,005,094 | 10.5% | ||
nhaji01 | 0 | 3,717,238,606 | 10.5% | ||
twosomesup | 0 | 3,923,321,942 | 9.97% | ||
wasined | 0 | 1,843,621,058 | 1.2% | ||
minas-glory | 0 | 1,484,521,881 | 10.5% | ||
clpacksperiment | 0 | 569,585,682 | 0.6% | ||
the-burn | 0 | 6,725,183,470 | 10.5% | ||
humbe | 0 | 7,252,847,299 | 2% | ||
dresden.theone | 0 | 466,341,327 | 10.5% | ||
jhymi | 0 | 1,366,622,338 | 0.6% | ||
vlad26 | 0 | 510,842,832 | 10.5% | ||
bodrex27 | 0 | 598,682,805 | 15.75% | ||
hd-treasury | 0 | 2,586,405,618 | 10.5% | ||
karina.gpt | 0 | 0 | 100% | ||
aunty-tosin | 0 | 1,293,637,457 | 10.5% | ||
rhemagames | 0 | 1,151,023,634 | 0.6% | ||
ruthmarquez | 0 | 468,022,296 | 21% | ||
mmjs826 | 0 | 2,579,542,825 | 21% | ||
flourishandflora | 0 | 1,258,107,578 | 10.5% | ||
luisarrazola | 0 | 1,078,979,742 | 10.5% | ||
bipolar95 | 0 | 3,521,032,208 | 10% | ||
blessskateshop | 0 | 552,335,699 | 10.5% | ||
hive-156436 | 0 | 1,375,736,351 | 10.5% | ||
ifhy | 0 | 2,229,614,307 | 10.5% | ||
hive.helps | 0 | 46,927,723,558 | 19.95% | ||
lolz.byte | 0 | 0 | 100% | ||
suarlex | 0 | 2,514,460,777 | 9.97% | ||
profwhitetower | 0 | 2,283,063,327 | 5% | ||
picazzy005 | 0 | 467,184,054 | 10.5% | ||
kai-ermae | 0 | 593,767,562 | 6.3% | ||
imx.center | 0 | 5,155,295,948 | 21% | ||
magic.byte | 0 | 0 | 100% | ||
coderad | 0 | 469,179,877 | 100% |
Congratulations @coderad! You have completed the following achievement on the Hive blockchain And have been rewarded with New badge(s) <table><tr><td><img src="https://images.hive.blog/60x70/https://hivebuzz.me/@coderad/payout.png?202503250241"></td><td>You received more than 50 HP as payout for your posts, comments and curation.<br>Your next payout target is 100 HP.<br><sub>The unit is Hive Power equivalent because post and comment rewards can be split into HP and HBD</sub></td></tr> </table> <sub>_You can view your badges on [your board](https://hivebuzz.me/@coderad) and compare yourself to others in the [Ranking](https://hivebuzz.me/ranking)_</sub> <sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub>
author | hivebuzz |
---|---|
permlink | notify-1742938357 |
category | hive-169321 |
json_metadata | {"image":["https://hivebuzz.me/notify.t6.png"]} |
created | 2025-03-25 21:32:36 |
last_update | 2025-03-25 21:32:36 |
depth | 1 |
children | 0 |
last_payout | 2025-04-01 21:32:36 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.000 HBD |
curator_payout_value | 0.000 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 767 |
author_reputation | 369,400,933,268,717 |
root_title | "How I saved 100s of hours of work for a local company using Python and python-docx (N00B Friendly) [Part 1/2]." |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 141,677,863 |
net_rshares | 0 |
https://www.reddit.com/r/learnprogramming/comments/1jjv5wb/wrote_a_quick_little_beginnerfriendly_write_up_on/ <sub> The rewards earned on this comment will go directly to the people( @coderad ) sharing the post on Reddit as long as they are registered with @poshtoken. Sign up at https://hiveposh.com. Otherwise, rewards go to the author of the blog post.</sub>
author | redditposh | ||||||
---|---|---|---|---|---|---|---|
permlink | re-coderad-how-i-saved-100s-of-hours-of-work-for-a-local-comp14982 | ||||||
category | hive-169321 | ||||||
json_metadata | "{"app":"Poshtoken 0.0.2","payoutToUser":["coderad"]}" | ||||||
created | 2025-03-25 21:39:33 | ||||||
last_update | 2025-03-25 21:39:33 | ||||||
depth | 1 | ||||||
children | 0 | ||||||
last_payout | 2025-04-01 21:39:33 | ||||||
cashout_time | 1969-12-31 23:59:59 | ||||||
total_payout_value | 0.000 HBD | ||||||
curator_payout_value | 0.163 HBD | ||||||
pending_payout_value | 0.000 HBD | ||||||
promoted | 0.000 HBD | ||||||
body_length | 362 | ||||||
author_reputation | 2,299,363,145,201,451 | ||||||
root_title | "How I saved 100s of hours of work for a local company using Python and python-docx (N00B Friendly) [Part 1/2]." | ||||||
beneficiaries |
| ||||||
max_accepted_payout | 1,000,000.000 HBD | ||||||
percent_hbd | 0 | ||||||
post_id | 141,677,956 | ||||||
net_rshares | 983,715,473,326 | ||||||
author_curate_reward | "" |
voter | weight | wgt% | rshares | pct | time |
---|---|---|---|---|---|
bpcvoter4 | 0 | 0 | 100% | ||
poshtoken | 0 | 900,536,970,573 | 40% | ||
nomnomnomnom | 0 | 82,718,188,361 | 40% | ||
coderad | 0 | 460,314,392 | 100% |
<div class='text-justify'> <div class='pull-left'> <img src='https://stem.openhive.network/images/stemsocialsupport7.png'> </div> Thanks for your contribution to the <a href='/trending/hive-196387'>STEMsocial community</a>. Feel free to join us on <a href='https://discord.gg/9c7pKVD'>discord</a> to get to know the rest of us! Please consider delegating to the @stemsocial account (85% of the curation rewards are returned). You may also include @stemsocial as a beneficiary of the rewards of this post to get a stronger support. <br /> <br /> </div>
author | stemsocial |
---|---|
permlink | re-coderad-how-i-saved-100s-of-hours-of-work-for-a-local-company-using-python-and-python-docx-n00b-friendly-part-12-20250326t043059765z |
category | hive-169321 |
json_metadata | {"app":"STEMsocial"} |
created | 2025-03-26 04:31:00 |
last_update | 2025-03-26 04:31:00 |
depth | 1 |
children | 0 |
last_payout | 2025-04-02 04:31:00 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.000 HBD |
curator_payout_value | 0.000 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 565 |
author_reputation | 22,918,491,691,707 |
root_title | "How I saved 100s of hours of work for a local company using Python and python-docx (N00B Friendly) [Part 1/2]." |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 141,683,004 |
net_rshares | 556,995,223 |
author_curate_reward | "" |
voter | weight | wgt% | rshares | pct | time |
---|---|---|---|---|---|
coderad | 0 | 556,995,223 | 100% |