Запустить Python скрипт в подкаталогах - PullRequest
1 голос
/ 06 марта 2020

У меня есть родительский каталог с подкаталогами, каждый из которых содержит файл. html, в котором я хочу запустить свой код. Это берет файл html и экспортирует соответствующий файл csv с данными таблицы.

Я пробовал два основных подхода, но ни один из них не работает должным образом, потому что он не может найти файл. html соответственно (не существует). Примечание: Имя каждого файла в подкаталоге всегда будет индексным. html

Linux Командная строка (на основе кода 1)

for file in */; do for file in *.html; do python html_csv2.py "$file"; done; done

Код 1:

name = 'index.html'
html = utils.getFileContent(name)
#Get data from file
doc = SimplifiedDoc(html)
soup = bs(html, 'lxml')

title = (soup.select_one('title').text)
title = title.split(' -')
strain = title[0]
rows = []
tables = doc.selects('table.region-table')
tables = tables[:-1]
#print (type(tables))
for table in tables:
    trs = table.tbody.trs
    for tr in trs:
        rows.append([td.text for td in tr.tds])
#print(rows)
#print(type(rows))
#print("PANDAS DATAFRAME")
df_rows = pd.DataFrame(rows)
df_rows.columns = ['Region', 'Class', 'From', 'To', 'Associated Product', 'Class', 'Similarity']
df_rows['Strain'] = strain
df_rows = df_rows[['Strain','Region', 'Class', 'From', 'To', 'Associated Product', 'Class', 'Similarity']] 
#print(df_rows)
df_rows.to_csv (r'antismash_html.csv', index = False, header=True)
print('CSV CREATED')

В этом втором фрагменте я пытаюсь использовать библиотеку os для go в каждом подкаталоге соответственно.

Код 2:

import csv
from simplified_scrapy import SimplifiedDoc,req,utils
import sys
import pandas as pd
import lxml.html
from bs4 import BeautifulSoup as bs
import os

name = 'index.html'
html = utils.getFileContent(name)
# Get data from file
doc = SimplifiedDoc(html)
soup = bs(html, 'lxml')

cwd = os.getcwd()
print(cwd)
directory_to_check = cwd # Which directory do you want to start with?

def directory_function(directory):
      print("Listing: " + directory)
      print("\t-" + "\n\t-".join(os.listdir("."))) # List current working directory

# Get all the subdirectories of directory_to_check recursively and store them in a list:
directories = [os.path.abspath(x[0]) for x in os.walk(directory_to_check)]
directories.remove(os.path.abspath(directory_to_check)) #Dont' want it done in my main directory

def csv_create(name):
    title = (soup.select_one('title').text)
    title = title.split(' -')
    strain = title[0]
    rows = []
    tables = doc.selects('table.region-table')
    tables = tables[:-1]
    #print (type(tables))
    for table in tables:
        trs = table.tbody.trs
        for tr in trs:
            rows.append([td.text for td in tr.tds])
    #print(rows)
    #print(type(rows))
    #print("PANDAS DATAFRAME")
    df_rows = pd.DataFrame(rows)
    df_rows.columns = ['Region', 'Class', 'From', 'To', 'Associated Product', 'Class', 'Similarity']
    df_rows['Strain'] = strain
    df_rows = df_rows[['Strain','Region', 'Class', 'From', 'To', 'Associated Product', 'Class', 'Similarity']] 
    #print(df_rows)
    df_rows.to_csv (r'antismash_html.csv', index = False, header=True)
    print('CSV CREATED')
    #with open(name +'.csv','w',encoding='utf-8') as f:
    #    csv_writer = csv.writer(f)
    #    csv_writer.writerows(rows)

for i in directories:
      os.chdir(i)         # Change working Directory
      csv_create(name)      # Run your function


directory_function
#csv_create(name)

Я попытался использовать приведенный ниже пример: Python: запустить скрипт во всех подкаталогах , но не смог выполнить его соответствующим образом.

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

В качестве альтернативы, вы можете рассмотреть возможность использования glob.glob(). Но будьте осторожны при поиске в папке, которую вы намереваетесь, указав свой путь в выражении glob - или cd'ing в папку.

glob даст вам плоский список относительных путей.

>>> import glob
>>> 
>>> files = glob.glob('**/*.py', recursive=True)
>>> len(files)
3177
>>> files[0]
'_wxWidgets-3.0.2/build/bakefiles/wxwin.py'
>>> 

Do c здесь с некоторыми примерами выражений глобуса: https://docs.python.org/3.5/library/glob.html

Если вы начнете выполнять глобальный поиск при рекурсивном поиске на диске из папки, в которой много вложенных вложенных папок, он будет тормозить интерпретатор до тех пор, пока он не завершит - или вы убьете сеанс.

1 голос
/ 08 марта 2020

Попробуйте это.

import os
from simplified_scrapy import utils
def getSubDir(name,end=None):
  filelist = os.listdir(name)
  if end:
    filelist = [os.path.join(name,l) for l in filelist if l.endsWith(end)]
  return filelist
subDir = getSubDir('./') # The directory which you want to start with
for dir in subDir:
  # files = getSubDir(dir,end='index.html')
  fileName = dir+'/index.html'
  if not os.path.isfile(fileName): continue
  html = utils.getFileContent(fileName)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...