2 votes

Python lit les fichiers dans un répertoire

Je dispose d'un fichier .csv contenant 3000 lignes de données réparties sur deux colonnes, comme suit :

uc007ayl.1  ENSMUSG00000041439
uc009mkn.1  ENSMUSG00000031708
uc009mkn.1  ENSMUSG00000035491

Dans un autre dossier, j'ai un graphique dont le nom est le suivant :

uc007csg.1_nt_counts.txt
uc007gjg.1_nt_counts.txt

Vous remarquerez que ces graphiques ont un nom dans le même format que ma 1ère colonne

J'essaie d'utiliser Python pour identifier les lignes qui ont un graphique et imprimer le nom de la deuxième colonne dans un nouveau fichier .txt.

Voici les codes que j'ai

import csv
with open("C:/*my dir*/UCSC to Ensembl.csv", "r") as f:
reader = csv.reader(f, delimiter = ',')
    for row in reader:
        print row[0]

Mais je ne peux pas aller plus loin et je suis coincé.

3voto

phihag Points 89765

Vous y êtes presque :

import csv
import os.path
with open("C:/*my dir*/UCSC to Ensembl.csv", "rb") as f:
    reader = csv.reader(f, delimiter = ',')
    for row in reader:
        graph_filename = os.path.join("C:/folder", row[0] + "_nt_counts.txt")
        if os.path.exists(graph_filename):
            print (row[1])

Notez que les appels répétés à os.path.exists peut ralentir le processus, surtout si le répertoire se trouve sur un système de fichiers distant et ne contient pas beaucoup plus de fichiers que le nombre de lignes du fichier CSV. Il est préférable d'utiliser os.listdir à la place :

import csv
import os

graphs = set(os.listdir("C:/graph folder"))
with open("C:/*my dir*/UCSC to Ensembl.csv", "rb") as f:
    reader = csv.reader(f, delimiter = ',')
    for row in reader:
        if row[0] + "_nt_counts.txt" in graphs:
            print (row[1])

1voto

vonPetrushev Points 2149

D'abord, essayez de voir si print row[0] donne vraiment l'identifiant correct du fichier.

Ensuite, concaténer le chemin des fichiers avec row[0] et vérifier si ce chemin complet existe (si le fichier existe, en fait) avec os.path.exists(path) (voir http://docs.python.org/library/os.path.html#os.path.exists ).

S'il sort, vous pouvez écrire la ligne [1] (la deuxième colonne) dans un nouveau fichier avec f2.write("%s\n" % row[1] (vous devez d'abord ouvrir f2 pour l'écriture bien sûr).

0voto

Burhan Khalid Points 50578

L'étape suivante serait de vérifier si le fichier existe ? Il y a plusieurs façons de le faire, mais j'aime bien la façon suivante EAFP approche.

try:
   with open(os.path.join(the_dir,row[0])) as f: pass
except IOError:
   print 'Oops no file'

the_dir est le répertoire où se trouvent les fichiers.

0voto

justinfay Points 731
result = open('result.txt', 'w')
for line in open('C:/*my dir*/UCSC to Ensembl.csv', 'r'):
    line = line.split(',')
    try:
        open('/path/to/dir/' + line[0] + '_nt_counts.txt', 'r')
    except:
        continue
    else:
        result.write(line[1] + '\n')
result.close()

0voto

J.F. Sebastian Points 102961
import csv
import os

# get prefixes of all graphs in another directory
suff = '_nt_counts.txt'
graphs = set(fn[:-len(suff)] for fn in os.listdir('another dir') if fn.endswith(suff))

with open(r'c:\path to\file.csv', 'rb') as f:
    # extract 2nd column if the 1st one is a known graph prefix
    names = (row[1] for row in csv.reader(f, delimiter='\t') if row[0] in graphs)
    # write one name per line
    with open('output.txt', 'w') as output_file:
        for name in names:
            print >>output_file, name

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X