2017-09-29 2 views
0

J'ai écrit du code qui fonctionne bien sur une machine Linux mais ne fonctionne pas sous Windows.Python subprocess.check_output converger vers windows

import subprocess 
import pandas as pd 
try: 
    from StringIO import StringIO 
except ImportError: 
    from io import StringIO 

def zgrep_data(f, string='', index='TIMESTAMP'): 
    if string == '': 
     out = subprocess.check_output(['zgrep', string, f]) 
     grep_data = StringIO(out)  
     data= pd.read_csv(grep_data, sep=',', header=0) 

    else: 
     col_out = subprocess.check_output(['zgrep', index, f]) 
     col_data = StringIO(col_out) 
     columns = list(pd.read_csv(col_data, sep=',')) 

     out = subprocess.check_output(['zgrep', string, f]) 
     grep_data = StringIO(out)  
     data= pd.read_csv(grep_data, sep=',',names=columns, header=None) 

    return data.set_index(index).reset_index() 

Je reçois une erreur: FileNotFoundError: [WinError 2] Le système ne peut pas trouver le fichier spécifié

Quand je vérifierai avec os.path.exists (FILE_PATH), il retourne vrai . Tout conseil sur la façon de modifier ce code pour qu'il fonctionne à la fois sur Python 2 & 3 plus Windows et Linux serait apprécié.

+0

'zgrep' n'est pas dans votre chemin. ce n'est pas une commande Windows standard, donc vous devez trouver une version de Windows et l'installer ... C'est la seule explication à l'erreur. Quel fichier vérifiez-vous? Qu'est-ce que 'file_path'? –

+0

Le fichier se trouve sur mon lecteur c. C: /Users/Chris/Documents/massivefile.csv –

+0

Donc filepath serait f dans la fonction –

Répondre

0

ce message signifie seulement une chose: l'exécutable est introuvable.

Cela n'a rien à voir avec votre fichier de données, car le processus n'est même pas exécuté.

Et pourquoi? car si zgrep est standard sur Linux, il est un port tiers sur Windows, donc vous devez d'abord l'installer à partir here

Notez que si vous voulez seulement grep une chaîne sur les fichiers csv, il est surpuissant d'utiliser zgrep. Il est préférable d'utiliser une approche python native, en lisant des lignes (ou des lignes, en utilisant le module csv) et des motifs correspondants. Vous pouvez même ouvrir les fichiers .gz en mode natif. Ensuite, il sera vraiment portable.