Python считывает csv-файл и удаляет из него пробелы

#python

#python

Вопрос:

Я создал скрипт, который считывает csv-файл. Когда я запускаю его в Pycharm, все выглядит нормально, однако, когда я отмечаю выходной текст и нажимаю CTRL C и вставляю его в Блокнот, я получаю пробелы между каждой буквой.

Например, когда у меня есть файл в Excel, я получаю следующее:

 30.11.2020 09:03    Torbjørn    SPF <Seksjon for Passord og Forebygging>    Vennligst endre passordet mitt til PST{facb0950fb7a5c537cf7fa68b8894027}
 

Когда я печатаю, копирую его из вывода Pycharm, я получаю следующее:

 2 0 2 0 - 1 1 - 3 0   0 9 : 0 3 : 5 1    T o r b j % C 3 % B 8 r n   % 3 C T o r b j % C 3 % B 8 r n % 3 E       S P F   % 3 C S e k s j o n   f o r   P a s s o r d   o g   F o r e b y g g i n g % 3 E         V e n n l i g s t   e n d r e   p a s s o r d e t   m i t t   t i l   P S T % 7 B f a c b 0 9 5 0 f b 7 a 5 c 5 3 7 c f 7 f a 6 8 b 8 8 9 4 0 2 7 % 7 D 
 

Как я могу удалить пробелы?

Я пытался использовать line = line.strip() , но безуспешно.

Мой скрипт:

 class Day05:
    print('')
    print('~~~~~~~~~~~~~~~~~~~~~~~~ Day 05 ~~~~~~~~~~~~~~~~~~~~~~~~')
    print('')

    def printDataInLogFile():
        # Header
        print("Datetimet", end='')
        print("Namet", end='')
        print("Sectiont", end='')
        print("Message")

        # Read and loop line by line
        file1 = open('./log.csv', 'r')
        lines = file1.readlines()
        for line in lines:
            line = line.strip()
            line = line.replace(' ', ' ')
            line = line.replace('æ', 'æ')
            line = line.replace('ø', 'ø')
            line = line.replace('å', 'å')
            line = line.replace('{', '{')
            line = line.replace('}', '}')
            date = ""
            name = ""
            section = ""
            message = ""

            for i, d in enumerate(line.split(";")):
                if(i == 0):
                    date = d
                elif(i == 1):
                    name = d
                elif(i == 2):
                    section = d
                elif(i == 3):
                    message = d

            # Body
            if(name != ""):
                print(str(date)   "t", end='')
                print(str(name)   "tt", end='')
                print(str(section)   "tt", end='')
                print(str(message))


    """ Script start """
    printDataInLogFile()
 

Некоторая строка с содержимым log.csv:

 2020-10-01 07:00:04;Lisbeth ;SPF <Seksjon for Passord og Forebygging>;I dag har jeg lyst til at PST{b53250c991675c7b0c712e9bdc2c1216} skal være passordet mitt
2020-10-01 07:02:22;Unni ;SPF <Seksjon for Passord og Forebygging>;Vennligst endre passordet mitt til PST{5cdadc1037fa416f7d79186adc55f1ff}
2020-10-01 07:03:11;Jan ;SPF <Seksjon for Passord og Forebygging>;I dag har jeg lyst til at PST{1241512147283b40bfe8e2eac36ac2dd} skal være passordet mitt
2020-10-01 07:04:26;Maria ;SPF <Seksjon for Passord og Forebygging>;Vennligst endre passordet mitt til PST{ca1d9d8d4243c374cb14faa8363bc0dc}
2020-10-01 07:06:52;Mellomleder ;SPF <Seksjon for Passord og Forebygging>;Bytt til PST{99e12ae9d06336a7d9c644641388450a}
2020-10-01 07:09:00;Robert ;SPF <Seksjon for Passord og Forebygging>;I dag har jeg lyst til at PST{da52537925c86ac5d5352edd78e10350} skal være passordet mitt
2020-10-01 07:11:13;Håkon ;SPF <Seksjon for Passord og Forebygging>;Vennligst endre passordet mitt til PST{2a6fa4d619a88882dbcf1df5dff8ff65}
2020-10-01 07:11:56;Terje ;SPF <Seksjon for Passord og Forebygging>;Jeg ønsker å endre passord til PST{4970a0cdd3f0eb19e9ec1d7423f26de8}
2020-10-01 07:14:33;Anette ;SPF <Seksjon for Passord og Forebygging>;I dag har jeg lyst til at PST{1b956ee14848acccdc150db512b2084d} skal være passordet mitt
2020-10-01 07:14:51;Daniel ;SPF <Seksjon for Passord og Forebygging>;Bytt til PST{80f7c07f7d06bbcd38f3af5c90afe866}
2020-10-01 07:15:29;Systemeier ;SPF <Seksjon for Passord og Forebygging>;Bytt til PST{e905beda4ccdfaf8c7b3388d057e37c4}
 

Комментарии:

1. Томалак: Спасибо за совет. Однако между каждым классом есть большие различия. Я изучаю python и каждый день создаю один скрипт с разными темами.

2. А, понятно, тогда продолжайте.

Ответ №1:

У меня есть файл в Excel, тогда я получаю это:

 30.11.2020 09:03
 

Когда я печатаю, копирую его из вывода Pycharm, я получаю следующее:

 2 0 2 0 - 1 1 - 3 0   0 9
 

Вы сохранили файл как Unicode в Excel, но вы не читаете файл как Unicode в Python.

 # Read and loop line by line
with open('./log.csv', 'r', encoding='utf-16-le') as file1:
    for line in file1:
        print(line)
 

Примечания

  • Используйте контекстные менеджеры для открытия files ( with open(...) as f: ) вместо голых open() вызовов.
  • Всегда открывайте текстовые файлы с явно указанным encoding . Если вы не знаете кодировку, вам нужно это выяснить. Доверие к значениям по умолчанию здесь не работает.
  • Используйте csv модуль для чтения CSV-файлов.
  • Используйте urllib модуль для декодирования значений, закодированных в URL, вместо того, чтобы пытаться выполнять ручную замену строк.

Например (для одного ввода, который представляет часть «значение» в key=value паре):

 from urllib.parse import parse_qs

raw_value = "Torbjørn "
parsed_value = parse_qs(f"temp={raw_value}")            # -> {'temp': ['Torbjørn <Torbjørn>']}
actual_value = parsed_value['temp'][0]                  # -> 'Torbjørn <Torbjørn>'
 

может быть превращен в функцию

 def decode_url_value(raw_value):
    parsed_value = parse_qs(f"temp={raw_value}")
    return parsed_value['temp'][0]

decode_url_value("Torbjørn ")   # -> 'Torbjørn <Torbjørn>'
 

Ответ №2:

Если вы используете библиотеки unidecode и urllib , вы можете легко это сделать:

 from unidecode import unidecode
from urllib.parse import unquote

...
file1 = open('./log.csv', 'r')
lines = file1.readlines()
for line in lines:
   line = unidecode(unquote(line))
   line = line.strip()
   line = line.replace(' ', ' ')
   # line = line.replace('æ', 'æ')
   # line = line.replace('ø', 'ø')
   # line = line.replace('å', 'å')
   # line = line.replace('{', '{')
   # line = line.replace('}', '}')
...
 

Вам больше не нужно будет вручную заменять специальные символы самостоятельно.

Ответ №3:

str.strip() удаляет только начальные и конечные пробелы, чтобы удалить все символы пробела, используйте str.replace(" ", "")

Комментарии:

1. это удалит все пробелы. Теперь это то, чего хочет OP.