2 votes

Comment créer plusieurs dataframes à partir d'un fichier ?

J'ai plusieurs fichiers txt qui ressemblent à ceci :

[Level1]
Location = "London"
Type= "GTHY66"
Date = "16-11-2021"
Energy level = "Critical zero"
[Level2]
0.000   26.788
0.027   26.807
0.053   26.860

Donc, à partir de chaque fichier que je lis/traite, je veux créer deux cadres de données (que je vais éventuellement pousser vers une base de données).

Le cadre de données du niveau 1 doit être df_level1 :

Location   Type      Date         Energy
London     GTHY66    16-11-2021   Critical zero

Le cadre de données sous le niveau 1 doit être df_level2 :

Speed   Energylevel
0.000   26.788
0.027   26.807
0.053   26.860

C'est ce que j'ai essayé, mais je suis resté bloqué :

energy_root= r'c:\data\Desktop\Studio\Energyfiles'

#create list of file paths
def read_txt_file(path):
    list_file_path = []
    for root, dirs, files in os.walk(path):
        for file in files:
            if file.endswith('.txt'):
                file_name = os.path.basename(file)
                file_path = os.path.join(root, file_name)
                list_file_path.append(file_path)

    return list_file_path     

def create_df():
    for file in read_txt_file(energy_root):
        file_name = os.path.basename(file)
        file_path = os.path.join(energy_root, file_name)
        datetime = re.findall(r'_(\d{8}_\d{6})\.', file_name)[0]

        with open(file_path, 'r+') as output:
            reader = output.readlines()
            for row in reader:
                d = row.split('=')
                if len(d) > 1:
                   df_level1 = pd.DataFrame([d[1]], columns=[d[0]])

                   print(df_level1 )
              "then create df_level2 ....."

create_df()

1voto

Zoff Dino Points 5010

Essayez ça :

def read_txt_file(path):
    n = 0
    pattern = re.compile(r'(.+)\s*=\s*\"(.+)\"')
    level1 = {}
    with open(path) as fp:
        for line in fp:
            line = line.strip()
            n += 1
            if line == '[Level2]':
                break

            m = pattern.match(line)
            if m is not None:
                key = m.group(1)
                value = m.group(2)
                level1[key] = value

    level1 = pd.DataFrame(level1, index=[0])
    level2 = pd.read_csv(path, sep='\s+', skiprows=n, header=None, names=['Speed', 'EnergyLevel'])
    return level1, level2

Utilisation :

level1, level2 = read_txt_file('data.txt')

1voto

Adam.Er8 Points 10581

Vous pouvez utiliser pd.read_csv avec les bons séparateurs, mais vous devez faire deux choses :

  1. Avant : Divisez les parties du fichier pour le niveau 1 et le niveau 2.
  2. Après : Transpose et fixe les colonnes du niveau 1

Voici le code, directement dans votre with open [...] ligne

reader = output.read() # simply the entire file text, not split into lines
parts = reader.split('[Level2]\n')
lvl1_lines = parts[0].split('[Level1]\n')[1].replace('"','')
lvl2_lines = "Speed   Energylevel\n" + parts[1]

from io import StringIO # to read strings as files for read_csv
df_level1 = pd.read_csv(StringIO(lvl1_lines), sep='\s*=\s*', engine='python').transpose().reset_index()
df_level1.columns = df_level1.iloc[0] # set the correct column names
df_level1 = df_level1[1:] # remove the column row
df_level2 = pd.read_csv(StringIO(lvl2_lines), sep='\\s+')

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