es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Escritor CSV (Python) con CRLF en lugar de LF

Hola, estoy intentando usar la biblioteca csv para convertir mi archivo CSV en uno nuevo.

El código que escribí es el siguiente:

import csv
import re

file_read = r'C:\Users\Comarch\Desktop\Test.csv'
file_write = r'C:\Users\Comarch\Desktop\Test_new.csv'

def find_txt_in_parentheses(cell_txt):
    pattern = r'(.+)'
    return set(re.findall(pattern, cell_txt))

with open(file_write, 'w', encoding='utf-8-sig') as file_w:
    csv_writer = csv.writer(file_w, lineterminator="\n")
    with open(file_read, 'r', encoding='utf-8-sig') as file_r:
        csv_reader = csv.reader(file_r)
        for row in csv_reader:
            cell_txt = row[0]
            txt_in_parentheses = find_txt_in_parentheses(cell_txt)
            if len(txt_in_parentheses) == 1:
                txt_in_parentheses = txt_in_parentheses.pop()
                cell_txt_new = cell_txt.replace(' ' + txt_in_parentheses,'')
                cell_txt_new = txt_in_parentheses + '\n' + cell_txt_new
                row[0] = cell_txt_new
            csv_writer.writerow(row)

El único problema es que en el archivo resultante (Test_new.csv), tengo CRLF en lugar de LF.
Aquí hay una imagen de muestra:

  • Archivo leído a la izquierda
  • Archivo escrito a la derecha:

Imagen de muestra

Y como resultado, cuando copio la columna CSV en un archivo de Excel en Google Docs, obtengo una línea en blanco después de cada fila con CRLF.

Imagen de muestra

¿Es posible modificar mi código utilizando la biblioteca csv para que se mantenga LF dentro de una celda en lugar de CRLF?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible escribir tu código utilizando la biblioteca csv en Python para asegurarte de que LF se quede dentro de una celda en lugar de CRLF.

    Puedes modificar tu código para utilizar el parámetro lineterminator con un valor de '\n', de esta manera:

    import csv
    import re
    
    file_read = r'C:\Users\Comarch\Desktop\Test.csv'
    file_write = r'C:\Users\Comarch\Desktop\Test_new.csv'
    
    def find_txt_in_parentheses(cell_txt):
        pattern = r'\(.+\)'
        return set(re.findall(pattern, cell_txt))
    
    with open(file_write, 'w', encoding='utf-8-sig', newline='') as file_w:
        csv_writer = csv.writer(file_w, lineterminator='\n')
        with open(file_read, 'r', encoding='utf-8-sig', newline='') as file_r:
            csv_reader = csv.reader(file_r)
            for row in csv_reader:
                cell_txt = row[0]
                txt_in_parentheses = find_txt_in_parentheses(cell_txt)
                if len(txt_in_parentheses) == 1:
                    txt_in_parentheses = txt_in_parentheses.pop()
                    cell_txt_new = cell_txt.replace(' ' + txt_in_parentheses, '')
                    cell_txt_new = txt_in_parentheses + '\n' + cell_txt_new
                    row[0] = cell_txt_new
                csv_writer.writerow(row)
    

    Observa que hemos agregado el parámetro newline='' a ambas llamadas de open(), y luego utilizamos el parámetro lineterminator='\n' al crear el objeto csv.writer.

    Con este cambio hecho, tu archivo CSV resultante debería tener saltos de línea LF dentro de cada celda.

Comments are closed.