Немного трюков с python - работа с csv, парсинг html и другое
Теги:
В этой заметке:
- Как проверить, что выбранная папка пустая
- Релятивный импорт в jupoyter notebook
- Как найти разницу между двумя датафреймами pandas (один фрейм явлется сабсетом другого)
- Удаление строк в .csv
- Как сконкатенировать два csv файла
- Менеджер контекста для webdriver selenium
- Как изменить порядок колонок датафрейма pandas
- Как спарсить таблицы из html-документа
- Как обрезать пробелы и переносы строк с двух коноцов строки
- Как в BeautifulSoup проверить, что выбранная строка является определенным тегом
Как проверить, что выбранная папка пустая
import os
if not os.listdir('/your/path'):
print("Directory is empty")
else:
print("Directory is not empty")
Папка так-же может отсутствовать, есть смысл проверять и это. Ссылка на стаковерфло
Обычно проверка бывает актуальна для удаления контента папки перед установкой нового содержимого (напирмем для успешного теста нам надо, что-бы нан начало теста папка была пустой). Удалять можно так:
import os, shutil
folder = '/path/to/folder'
for filename in os.listdir(folder):
file_path = os.path.join(folder, filename)
try:
if os.path.isfile(file_path) or os.path.islink(file_path):
os.unlink(file_path)
elif os.path.isdir(file_path):
shutil.rmtree(file_path)
except Exception as e:
print('Failed to delete %s. Reason: %s' % (file_path, e))
В данном примере мы делаем дополнительные проверки на случай, если в папке подпапки. В простом варианте достаточно пройти по всем файлам. Ссылка на стаковерфло
Релятивный импорт в jupyter notebook
В блокнотах jupyter наблюдаются проблемы с ипортом. Импорты можно прописать в sys.path
. Пример
dir_1
├── functions.py
└── dir_2
└── code.ipynb
import os, sys
dir2 = os.path.abspath('')
dir1 = os.path.dirname(dir2)
if not dir1 in sys.path: sys.path.append(dir1)
from functions import some_function
Как найти разницу между двумя датафреймами [pandas] (один фрейм явлется сабсетом другого)
Это бывает полезно, когда мы получили выборку из фрейма, произвели манипуляции над ней и, если все прошло учпешно, теперь хотим отбросить эти данные из сходного фрейма.
pd.concat([df1,df2]).drop_duplicates(keep=False)
Могут возникнуть ситуации, когда в каждом фрейме есть дубликаты. Тогда этот метод может показать неожиданные результаты. Читай дальше
Как изменить порядок колонок датафрейма [pandas]
Все просто - получаем список названий колонок, меняем порядок как нужно, передаем датафрейму
cols = df.columns.tolist()
# do something with cols
df = df[cols]
Удаление строк в .csv
import csv
with open('first.csv', 'rb') as inp, open('first_edit.csv', 'wb') as out:
writer = csv.writer(out)
for row in csv.reader(inp):
if row[2] != "0":
writer.writerow(row)
Если нужно добавлять новые строки к уже заполненному файлу, можно открыть в режиме a
. Сслыка
Как сконкатенировать два .csv файла
file1 = open("sample1.csv", "a")
file2 = open("sample2.csv", "r")
for line in file2:
file1.write(line)
file1.close()
file2.close()
Ествтественно это лучше сделать через менеджер контекста
Менеджер контекста для webdriver selenium
Задача ни чем не отличается от стандарта
from selenium import webdriver
class WebDriver:
def __init__(self, driver):
self.driver = driver
def __enter__(self):
return self.driver
def __exit__(self, exc_type, exc_val, exc_tb):
self.driver.quit()
with WebDriver(webdriver.Chrome()) as wd:
wd.get('https://stackoverflow.com/questions/')
print(wd.page_source)
Как спарсить таблицы из html-документа
Можно попробовать написать свой парсер, а можно воспользоваться готовым pandas.read_html
import pandas as pd
import requests
url = "https://worldpopulationreview.com/countries/countries-by-gdp/#worldCountries"
r = requests.get(url)
df_list = pd.read_html(r.text) # this parses all the tables in webpages to a list
df = df_list[0]
df.head()
Как обрезать пробелы и переносы строк с двух коноцов строки
s = s.strip(' \t\n\r').lstrip(' \t\n\r')
Как в BeautifulSoup проверить, что выбранная строка является определенным тегом
На самом деле методов встроенных нет, поэтому так:
if element.name == 'div':
...
Смотри так-же: