¿Cómo puedo transformar cada 7 filas en una sola fila en un archivo csv con Python?

CorePress2024-01-24  11

Ejemplo de archivo csv:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

nuevo archivo csv que quiero:

1    2    3    4    5    6    7
8    9    10   11   12   13   14
15   16   17   18   19   20   21

Nota: quiero tabulación entre cada número.

1

recorres el archivo en iteración, en cada séptima línea lista (usa el mod 7), escribe en el archivo.

- Joe Ferndz

27/03/2021 a las 21:01

Adición al comentario de @JoeFerndz: Necesitas to aplicar algún formato de línea adicional para obtener el resultado deseado.

- alberto

27/03/2021 a las 21:04

3

Bienvenido a Stack Overflow. Lea cómo hacer buenas preguntas. Asegúrese de que su pregunta cubra estos 3 elementos: 1. Planteamiento del problema 2. Su código (debe ser un ejemplo mínimo y reproducible 3. Mensaje de error (preferiblemente seguimiento completo para ayudar a otros a revisar y proporcionar comentarios). A veces, es posible que la misma pregunta ya se haya formulado preguntó. Asegúratetu pregunta no está duplicada

- Joe Ferndz

27/03/2021 a las 21:05

¿Qué has probado hasta ahora? Stackoverflow no es una plataforma de escritura de código. Sin embargo, si proporciona un fragmento de código de muestra que nos muestre dónde está atascado, estaremos encantados de ayudarle.

- alberto

27/03/2021 a las 21:05

Investigue la "fragmentación".

- Poda

27/03/2021 a las 21:21



------------------------------------

Esto se puede hacer en pandas:

import pandas as pd
df = pd.read_csv('filename.csv', header=None)
df = pd.DataFrame(df.values.reshape(-1, 7))
df.to_csv("output.csv", sep="\t", header=False)

salida df:

0 1 2 3 4 5 6 0 1 2 3 4 5 6 7 1 8 9 10 11 12 13 14 2 15 dieciséis 17 18 19 20 21

1

Genial!!! pandas es una solución buena y rápida para esto

– Joe Fernández

27/03/2021 a las 21:28



------------------------------------

file = open("yourFile.csv", "r")
newFile = open("newFile.csv", "w")

for line in file.read().strip().split("\n"):
    newFile.write(line)
    if (int(line) % 7 == 0):
        newFile.write("\n")
    else:
        newFile.write("\t")

file.close()
newFile.close()

2

1

No debes considerar el valor del archivo sino los números de fila. Así que utilice enumerar en lugar de calcular basándose en líneas

- Joe Ferndz

27/03/2021 a las 21:12

1

Dado que la operación de E/S es más costosa, intente minimizar la operación de E/S y use la memoria para almacenar los datos temporales (escriba una vez cada 7 filas leídas en lugar de escribir cada vez)

- Joe Ferndz

27/03/2021 a las 21:27



------------------------------------

Hubiera preferido que mostraras tu trabajo primero antes de publicar la respuesta.

Aquí está la respuesta de todos modos, por lo que le brinda algunos consejos para resolver este problema.

with open('abc.txt', 'r') as f1, open ('xyz.txt','w') as f2:
    write_line = ''
    for i, line in enumerate(f1):
        line = line.strip()
        if i != 0 and i %7 == 0:
            write_line += '\n'
            f2.write(write_line)
            write_line = line + '\t'
        else:
            write_line += line + '\t'
    if i != 0 and i %7 != 0:
        f2.write(write_line)

Realice un seguimiento de la fila que lee. Si la fila es la primera (i==0), simplemente agregue la línea + \t a una variable temporal. Si la línea esel 8/15/... (i%7 ==0), entonces ya has leído 7 filas. Entonces escriba los datos en el archivo de salida. Luego restablece la variable temporal para que puedas hacer esto nuevamente.

Una vez que esté fuera del bucle, asegúrese de escribir el último conjunto de filas. A veces el archivo puede acabar teniendo 20 filas. Por lo tanto, debes asegurarte de escribir las últimas 6 filas en el archivo de salida.

El resultado de esto será:

1   2   3   4   5   6   7   
8   9   10  11  12  13  14  
15  16  17  18  19  20  21  

Si el archivo de entrada tuviera valores del 1 al 24, el archivo de salida tendría este aspecto:

1   2   3   4   5   6   7   
8   9   10  11  12  13  14  
15  16  17  18  19  20  21  
22  23  24  

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare