2017-07-19 4 views
0

En espérant que cette question n'est pas trop vague, ou en demander trop. Essentiellement, j'analyse de grandes quantités de spectres, et je veux créer une grande page Web qui contient ces spectres plutôt que de regarder des spectres individuels. Ci-joint un exemple de ce que le résultat final devrait ressembler.Python: Tirer .png à partir d'un site Web, sortir à un autre

example

Chaque spectres individuels là-bas est tiré d'une énorme bibliothèque. Cela fait longtemps que je n'ai pas codé, donc c'est toujours une expérience d'apprentissage. J'ai réussi à créer une page Web et à faire avancer un seul spectre. Mais n'ont pas mis ces deux ensemble. Surtout pas à l'échelle de centaines de milliers. Vraisemblablement, il s'agit d'une boucle for? Si quelqu'un pouvait vous aider, ce serait incroyable, pointez dans une direction ou un gabarit. Cela devrait être très facile, mais je me bats. P.s. Une grande partie de mon travail est actuellement en anaconda python

+0

https://i.stack.imgur.com/dmOz5.png Voici l'attachement désolé. – l1ve4science

Répondre

0

Pas trop surprenant, vous êtes peu en mer avec ce projet. Cela nécessite de combiner Python, HTML et éventuellement CSS. "Chaque spectre est tiré d'une bibliothèque massive" - ​​Je vais supposer dans cette réponse que vous avez tiré les spectres d'intérêt dans un répertoire local et que vous voulez les regarder dans une page web servie localement. Je vais aussi supposer que tous les fichiers png sont de la même taille.

Si cela est correct, ce que vous voulez, c'est de créer un fichier HTML simple qui fait référence à tous les fichiers png, en les plaçant dans un tableau simple. Pour ce faire, le code doit cd dans le répertoire avec les fichiers image, ouvrir un fichier de sortie nommé "index.html" (le nom est significatif), utiliser glob pour obtenir tous les noms des images de spectres, et faire une boucle sur le noms écrivant le html pour la page. Une fois que vous avez le fichier créé, vous pouvez le servir localement avec la commande de ligne de commande

python -m http.server 8000 

Vous pouvez alors voir votre page en pointant le navigateur à http://localhost:8000.

Voici un exemple mise en œuvre

from glob import glob 
    import os 

    def spectra_imgs(spectra_dir, sp_format): 
     '''Return an iterable with names of all the files in the spectra_dir 
     that match the name format sp_format.''' 
     for gl_name in glob(os.path.join(spectra_dir, sp_format)): 
      yield os.path.basename(gl_name) 

    def add_img(sp_img, side, outfile): 
     ''' Add a table item to existing table. 
      sp_img is the filename of the image 
      side is "left" or "right" 
      outfile is an open file handle 
      Returns None 
     ''' 
     if side == 'left': 
      outfile.write('<tr><td class="left_img"><img src="{0}" alt={0}></td>\n"'.format(sp_img)) 
     elif side == 'right': 
      outfile.write('<td class="right_img"><img src="{0}" alt={0}></td></tr>\n"'.format(sp_img)) 
     else: 
      raise ValueError("Side must be either left or right, not {0}".format(side)) 

    def sides(): 
     ''' Return an iterator that supplies an infinite sequence of "left" and "right".''' 
     while True: 
      yield "left" 
      yield "right" 

    def write_prefix(outfile): 
     outfile.write(
     '<!DOCTYPE html>\n' 
     '<html class="spectra_page" lang="en">\n' 
     '<head>\n' 
     '<meta charset="UTF-8"/>\n' 
     '<title>Spectra Comparison Page</title>\n' 
     '<style>\n' 
     'table { width: 100%; }\n' 
     '#left_img { align-items: center }\n' 
     '#right_img { align-items: center }\n' 
     'img { height:500px; width:500px }\n' # change to whatever size you want the images displayed at 
     '</style>\n' 
     '</head>\n' 
     '<body>\n') 


    def write_suffix(outfile): 
     outfile.write(
     '</table>\n' 
     '</body>\n' 
     '</html>\n' 
     ) 

    def write_spectra_page(spectra_dir): 
     ''' Write an index.html file with all the spectra images shown. ''' 
     with open(os.join(spectra_dir, "index.html")) as outfile: 
      write_prefix(outfile) 
      for side, sp_img in zip(sides, spectra_imgs(spectra_dir,'sp*.png'): 
       add_img(sp_img, side, outfile) 
      if side == "left": 
       # need to close the table row 
       outfile.write('</tr>\n') 
      write_suffix(outfile) 
+0

Ils sont tous tirés de ce https://data.sdss.org/sas/dr13/eboss/spectro/redux/images/v5_9_0/v5_9_0/4381-55824/ – l1ve4science

+0

En outre, toutes les images sont de tailles différentes – l1ve4science

+0

Le 'img 'tag dans le CSS rendra les images toutes affichées à la même taille, mais il peut s'étirer pour les faire correspondre. Vous pouvez modifier la balise '' de sorte que plutôt que de charger les images d'un magasin local, le navigateur les chargerait sur Internet chaque fois que vous aborderiez la page. Ce sera probablement lent. Je choisirais seulement cette méthode si vous n'avez pas assez d'espace de stockage sur votre ordinateur. – verisimilidude