Use Python para leer archivos de formato LabVIEW TDMS en formato Excel + versión multiproceso

Use Python para leer archivos de formato LabVIEW TDMS en formato Excel + versión multiproceso

Prefacio:

Actualización, siempre he querido probar el grupo de procesos, porque después de leer el curso en la estación B, encontré que el grupo de procesos es mucho más conveniente que el módulo multiproceso tradicional, y es mucho más rápido. Siempre he querido probarlo. No hay un ejemplo adecuado antes, aprendizaje por refuerzo La parte, debido a que hay demasiadas cosas involucradas, no se puede usar como un ejemplo simple para probar.
Sucedió que ayer tomó mucho tiempo hacer esta conversión, una tarea típica que consume recursos informáticos, así que me pregunté si podría usar el grupo de procesos y pasar por el proceso una vez.

¡Lo probé y realmente funcionó!

Al leer directamente con el módulo nptdms, si su archivo tdms no es válido, se informará un error:

1). ValueError: Segment does not start with TDSm, but with $ '
2). ValueError: Segment does not start with TDSm, but with " %

La razón es que:

Parece que está intentando leer archivos que no son archivos TDMS válidos, ya que no comienzan con los primeros cuatro bytes TDSm que deberían estar al principio de todos los archivos TDMS.

Enlace de referencia:
https://github.com/adamreeve/npTDMS/issues/123

Así que tuve que elegir el método de lectura de archivos más básico, leer por línea, procesarlo manualmente en formato pandas y luego guardarlo como formato de archivo Excel.

antecedentes

Los archivos de formato TMDS de Labview a menudo aparecen en una gran cantidad de trabajos relacionados con el hardware y, a veces, se enfrentan a la situación de convertir TDMS a formato general de Excel. Normalmente, Excel no tiene problemas siempre que esté cargado con el complemento TDMS. frente a una gran cantidad de TDMS Obviamente, es una pérdida de tiempo convertir manualmente archivos TDMS en archivos Excel uno por uno. A continuación se describe cómo usar Python con pandas y xlsxwriter para convertir archivos TMDS en archivos Excel en lotes:

estilo de archivo tmds

De hecho, es un contenido de número + carácter de tabulación + carácter de nueva línea, leer de acuerdo con el texto más básico, agregar reemplazo y luego completar la conversión de formato.

974.832	1012.613	1016.344	1012.713	1012.009	1015.501	1000.094	1012.158	1011.943	1026.974	1011.168	1011.470	974.860	1011.517	1012.005	1062.471	1011.013	970.696	1012.960	1011.206	1011.439	1003.868	1011.456	1013.407	1011.972	1010.859	1011.276	1024.039	1039.353	1011.088	1012.036	1010.735	1011.564	1011.131	1011.837	1012.786
974.865	1012.567	1016.372	1012.719	1011.996	1015.527	1000.109	1012.148	1011.952	1026.951	1011.189	1011.471	974.846	1011.503	1012.065	1062.495	1011.044	970.726	1012.951	1011.242	1011.460	1003.885	1011.459	1013.423	1011.970	1010.856	1011.310	1024.043	1039.399	1011.112	1012.026	1010.742	1011.571	1011.164	1011.808	1012.732
974.862	1012.610	1016.382	1012.736	1012.038	1015.497	1000.135	1012.132	1011.952	1026.975	1011.145	1011.454	974.825	1011.512	1012.047	1062.503	1011.046	970.711	1012.946	1011.243	1011.487	1003.897	1011.468	1013.414	1012.003	1010.875	1011.280	1024.038	1039.380	1011.098	1012.008	1010.776	1011.573	1011.166	1011.865	1012.772
974.841	1012.577	1016.365	1012.700	1012.008	1015.509	1000.092	1012.156	1011.984	1026.962	1011.171	1011.443	974.826	1011.567	1012.039	1062.488	1011.032	970.715	1012.983	1011.187	1011.442	1003.905	1011.448	1013.408	1011.974	1010.837	1011.264	1024.038	1039.415	1011.086	1012.042	1010.779	1011.574	1011.141	1011.826	1012.772

Código:

import xlwt
import codecs
import os
"""
├─tdms_scripts
│  ├─excel
│  └─tdms
│──tmds2excel.py
"""

# 改为你的tmds文件夹!的路径,比如0静止
root_path = r'F:\rl_code\tdms_scripts'
# 修改这里,第0个为1,第1个从1001开始
task_num = 0
# 创建一个excel文件夹
try:
    os.mkdir(os.path.join(root_path, 'excel'+str(task_num)))
except:
    pass
tdms_files = os.listdir(os.path.join(root_path, 'tdms'))
# 将文件名从小到大排序
tdms_files.sort()
# [print(t) for t in tdms_files]

file_count = 1 + task_num * 1000
for tdms_file in tdms_files:
    print("tdms_file:", tdms_file, end='\t')
    sheetName = 'Sheet1'
    start_row = 0
    start_col = 0

    wb = xlwt.Workbook(encoding = 'utf-8')
    ws = wb.add_sheet(sheetName)
    tdms_path = os.path.join(root_path, 'tdms', tdms_file)
    f = open(tdms_path, encoding = 'utf-8')

    row_excel = start_row
    for line in f:
        # 消除换行符
        line = line.strip('\n')
        # 以制表符'\t'作为切分对象,将长字符串,转为短字符串列表;
        # 如果原数据用空格切分,则line = line.split(' ')
        line = line.split('\t')

        col_excel = start_col
        len_line = len(line)
        for j in range(len_line):            
            ws.write(row_excel,col_excel,line[j])
            col_excel += 1
            excel_path = os.path.join(root_path, 'excel'+str(task_num), str(file_count)+'.xls')            
            # 如果用原名,用下面的句子
            # excel_path = os.path.join(root_path, 'excel', tdms_file.replace('tdms', 'xls'))            
            wb.save(excel_path)

        row_excel += 1
    
    f.close
    print("excel_path:", excel_path)
    file_count += 1

Versión del grupo de procesos:

Debido al largo tiempo de procesamiento de un solo archivo, se escribió una versión multiproceso del script de procesamiento.
¡El núcleo de la CPU puede acelerar el procesamiento varias veces!

from multiprocessing import Pool
import xlwt
import codecs
import os
import time
"""
├─tdms_scripts
│  ├─excel
│  └─tdms
│──tmds2excel.py
"""

# 改为你的tmds文件夹!的路径,比如0静止
root_path = r'F:\rl_code\calibration\tdms_scripts'
# 修改这里,第0个为1,第1个从1001开始
task_num = 0
# 创建一个excel文件夹
try:
    os.mkdir(os.path.join(root_path, 'excel'+str(task_num)))
except:
    pass
tdms_files = os.listdir(os.path.join(root_path, 'tdms'))
# 将文件名从小到大排序
tdms_files.sort()
# [print(t) for t in tdms_files]

file_count = 1 + task_num * 1000


def tdms2excel(tdms_index_file):
    st = time.time()

    index, tdms_file = tdms_index_file
    print("tdms_file:", tdms_file, end='\t')
    sheetName = 'Sheet1'
    start_row = 0
    start_col = 0
    wb = xlwt.Workbook(encoding = 'utf-8')
    ws = wb.add_sheet(sheetName)
    tdms_path = os.path.join(root_path, 'tdms', tdms_file)
    f = open(tdms_path, encoding = 'utf-8')

    row_excel = start_row
    for line in f:
        # 消除换行符
        line = line.strip('\n')
        # 以制表符'\t'作为切分对象,将长字符串,转为短字符串列表;
        # 如果原数据用空格切分,则line = line.split(' ')
        line = line.split('\t')
        # print("line:",  line)

        col_excel = start_col
        len_line = len(line)
        for j in range(len_line):            
            ws.write(row_excel, col_excel, line[j])
            col_excel += 1
            excel_path = os.path.join(root_path, 'excel'+str(task_num), str(index)+'.xls')            
            # 如果用原名,用下面的句子
            # excel_path = os.path.join(root_path, 'excel', tdms_file.replace('tdms', 'xls'))            
            wb.save(excel_path)

        row_excel += 1
    
    f.close
    print("excel_path:", excel_path, end='\t')
    print("trans_time:", time.time()-st)


if __name__ == '__main__':
    p = Pool()    
    p.map(tdms2excel, [[index, tdms_file] for index, tdms_file in enumerate(tdms_files)])

Mi computadora portátil es una CPU de ocho núcleos a 2.6 Ghz y el tiempo de procesamiento de un solo proceso es de entre 20 y 30 segundos. Después de usar el grupo de procesos, se ejecutan ocho procesos juntos. Es obvio que cada octavo, hay un tiempo está estratificado, y el efecto de ocho trabajadores trabajando por turnos se refleja ~

Esto es mucho más elegante que abrir manualmente ocho scripts, usar la función de los scripts recién abiertos de Python para ejecutarse automáticamente en otros núcleos de CPU y usar otros núcleos de CPU ~

resultado de ejecución:

tdms_file: 1_2021_02_21_22_41_15.tdms excel_path:… cel0 \ 0.xls single_time: 27.0803 total_time: 27.0957
tdms_file: 1_2021_02_21_22_41_58.tdms excel_path:… cel0 \ 4.xls excel2_tiempo_tiempo: 27.0957
. xls single_time: 28.6732 total_time: 28.6935
tdms_file: 1_2021_02_21_22_41_48.tdms excel_path:… cel0 \ 3.xls single_time: 29.9796 total_time: 29.9925
tdms_file: 1_2021_02_21_22_41_26.td_5_tiempo_total: tdms_02_21_22_41_26.td_td_tiempo_total_20:
tdms_02_02_21_22_41_26.td_02_t_tiempo_total_de_http: 1. excel_path:… cel0 \ 7.xls single_time: 31.049 total_time: 31.0644
tdms_file: 1_2021_02_21_22_42_14.tdms excel_path:… cel0 \ 6.xls single_time: 32.2027 total_time: 32.2215
tdms_file: 1_2021_02_21_22_42_05.tdms excel_path: ... cel0 \ single_time 5.xls: 33.8177 TOTAL_TIME: 33.8405
tdms_file: 1_2021_02_21_22_42_32.tdms excel_path: ... cel0 \ single_time 8.xls: 33.5036 TOTAL_TIME: 60.6003
tdms_file: 1_2021_02_21_22_43_05.tdms excel_path: ... el0 \ 12. xls single_time: 29.8122 60.6732 TOTAL_TIME:
tdms_file: 1_2021_02_21_22_44_03.tdms excel_path: ... \ el0 14.xls single_time: 28.4923 60.7139 TOTAL_TIME:
tdms_file: 1_2021_02_21_22_42_40.tdms excel_path: ... cel0 \ single_time 9.xls: 33.4553 60.9589 TOTAL_TIME:
tdms_file: 1_2021_02_21_22_43_54.tdms excel_path:… el0 \ 13.xls single_time: 29.904 total_time: 60.9688
tdms_file: 1_2021_02_21_22_44_14.tdms excel_path:… el0 \ 15.xls single_time: 28.3613 total_time: 62.2024
tdms_file: 1_2021_02_21_22_42_57.tdms excel_path:… el0 \ 11.xls single_time: 34.8927 total_time: 64.8862
tdms_file: 1_2021_02_21_22_42_49.tdms excel_path:… elms0 \ 10.xls single_tiempo_8_44:
tdms: ... xls single_time: 25.6077 total_time: 86.577
tdms_file: 1_2021_02_21_22_44_36.tdms excel_path
:… el0 \ 17.xls single_time: 30.7522 total_time: 91.4259
tdms_file: 1_2021_02_21_22_44_44. excel_path:… el0 \ 19.xls single_time: 33.3145 total_time: 94.2744
tdms_file: 1_2021_02_21_22_44_28.tdms excel_path:… el0 \ 16.xls single_time: 34.4439 total_time: 95.0447
tdms_file: 1_2021_02_21_22_45_12.tdms excel_path: ... el0 \ 22.xls single_time: 33.2763 TOTAL_TIME: 98.1626
tdms_file: 1_2021_02_21_22_45_05.tdms excel_path: ... el0 \ 21.xls single_time: 37.2711 TOTAL_TIME: 99.4745
tdms_file: 1_2021_02_21_22_45_19.tdms excel_path: ... el0 \ 23. xls single_time: 34.0878 TOTAL_TIME: 101.8221
tdms_file: 1_2021_02_21_22_45_27.tdms excel_path: ... \ el0 24.xls single_time: 30.2179 TOTAL_TIME: 116.7959
tdms_file: 1_2021_02_21_22_45_35.tdms excel_path: ... \ el0 25.xls single_time: 25.7747 TOTAL_TIME: 117.2011
tdms_file: 1_2021_02_21_22_45_56.tdms excel_path:… el0 \ 28.xls single_time: 25.1771 total_time: 120.2228
tdms_file: 1_2021_02_21_22_45_42.tdms excel_path:… el0 \ 26.xls single_time: 26.8273 total_time: 120.7738
tdms_file: 1_2021_02_21_22_45_50.tdms excel_path: ... el0 \ 27.xls single_time: 27.3055 total_time: 121.5819
tdms_file: 1_2021_02_21_22_46_03.tdms excel_path:… el0 \ 29.xls 122.0240 total_time: 23.8782.

Detalles de contacto

ps: Bienvenidos estudiantes que son intensivos para unirse al grupo para estudiar juntos:

Aprendizaje de refuerzo profundo-DRL: 799378128

Bienvenido a seguir la cuenta de Zhihu: aprendices de alquimia que aún no han comenzado

Cuenta CSDN: https://blog.csdn.net/hehedadaq

Supongo que te gusta

Origin blog.csdn.net/hehedadaq/article/details/114543824
Recomendado
Clasificación