1
votes

Récursivité Python avec boucle for

Je souhaite traiter certains fichiers avec Python et avoir les scripts ci-dessous:

for n in range (1,8):
    dfn = pd.read_table(locn, sep=('\t'), engine='python')
    sn = dfn[dfn['No (Int)'] == 4]

J'essayais de simplifier les scripts entre le début et la fin de ce qui précède en utilisant la boucle for, mais python ne peut pas identifier:

import pandas as pd
loc1 = r'D:\1103\DC431.txt'
loc2 = r'D:\1103\DC432.txt'
loc3 = r'D:\1103\DC433.txt'
loc4 = r'D:\1103\DC434.txt'
loc5 = r'D:\1103\DC435.txt'
loc6 = r'D:\1103\DC436.txt'
loc7 = r'D:\1103\DC437.txt'
# Start
df1 = pd.read_table(loc1, sep=('\t'), engine='python')
df2 = pd.read_table(loc2, sep=('\t'), engine='python')
df3 = pd.read_table(loc3, sep=('\t'), engine='python')
df4 = pd.read_table(loc4, sep=('\t'), engine='python')
df5 = pd.read_table(loc5, sep=('\t'), engine='python')
df6 = pd.read_table(loc6, sep=('\t'), engine='python')
df7 = pd.read_table(loc7, sep=('\t'), engine='python')

s1 = df1[df1['No (Int)'] == 4]
s2 = df2[df2['No (Int)'] == 4]
s3 = df3[df3['No (Int)'] == 4]
s4 = df4[df4['No (Int)'] == 4]
s5 = df5[df5['No (Int)'] == 4]
s6 = df6[df6['No (Int)'] == 4]
s7 = df7[df7['No (Int)'] == 4]
# End

# Other scripts

Quelqu'un a de bonnes idées?


0 commentaires

3 Réponses :


-2
votes

Vous pouvez utiliser eval pour obtenir la valeur de la variable Xn , et utiliser exec pour exécuter une instruction. Voici un exemple simple:

1
{'w': 1}
2
4
1234

Le résultat est:

a1 = 1
a2 = 2
b1 = {'1':{'w':1}, '2':2}
b2 = {'1':{'w':3}, '2':4}
for i in range(1,3):
    print(eval('a%d' % i))
    print(eval('b%d' % i)[str(i)])
exec('hello%d = 1234' % 99)
print(hello99)

Testé sur Python3.4.9


1 commentaires

Vous pouvez , mais vous ne devriez vraiment, vraiment pas.



1
votes

dfn et sn sont des noms de variables, python ne sait pas que vous voulez dire un index n . Vous pouvez utiliser des listes à la place. D'abord sans compréhension de liste:

import pandas as pd

locs = [r'D:\1103\DC43{}.txt'.format(i) for i in range(1,8)]
dfs = [pd.read_csv(loc, sep='\t') for loc in locs]
ss = [df[df['No (Int)'] == 4] for df in dfs]

Avec compréhension de liste:

import pandas as pd

locs = []
dfs = []
ss = []

for i in range(1, 8):
    locs[i] = r'D:\1103\DC43{}.txt'.format(i)
    dfs[i] = pd.read_csv(locs[i], sep='\t')
    ss[i] = dfs[i][dfs[i]['No (Int)'] == 4

Remarque:

  • pandas.read_table est obsolète au profit de pandas.read_csv .
  • le moteur C suffit probablement, rajoutez le moteur python uniquement si nécessaire.


2 commentaires

pour votre solution sans compression de liste, j'ai rencontré IndexError: index d'affectation de liste hors limites. Avez-vous des suggestions?


Je ne peux pas dire sans voir ce que vous faites.



1
votes

Que diriez-vous de:

dict_result = dict()
for id in range(431, 438):
    loc = r'D:\1103\DC{0}.txt'.format(id)
    df = pd.read_table(loc, sep=('\t'), engine='python')
    s = df[df['No (Int)'] == 4]
    dict_result[id] = (loc, df, s)


0 commentaires