Редактирование поврежденных строк в файле CSV

#python #csv

#python #csv

Вопрос:

У меня есть файл CSV следующим образом:

 fruit, country,  city
banana, japan, tokyo
apple, brazil, rio
apple, korea, south, seoul
banana, denmark, copenhagen
  

Это пример, на самом деле у меня эта проблема в нескольких больших файлах. Проблема в том, что я не могу прочитать 4-ю строку с разделителем-запятой, так как в ней будет слишком много одного столбца.

Моя идея состоит в том, чтобы

  1. откройте файл с помощью csv.reader
  2. найдите строки с term1 в столбце 2 и term2 в столбце 3 (в моем примере term1 = Корея и term2 = юг)
  3. Замените term1 в столбце 2 на term1 и term2 в сочетании (Южная Корея) и удалили 3-й столбец в строке
  4. сохраните отредактированный файл

В приведенном ниже коде я выполнил первые два шага, но я застрял на шагах 3 и 4.

 import csv

path = r'C:UsersjloboDesktopexample.txt'

with open(path, newline='') as csvfile:
    csv_read = csv.reader(csvfile, delimiter=',', quotechar='"') #
    
    for row in csv_read:
        search_terms1 = ["korea"]
        search_terms2 = ["south"]

        if any([term in row[1] for term in search_terms1]) and any([term in row[2] for term in search_terms2]):
            print(row)
  

Как я могу выполнить шаги 3 и 4? Или, если это уместно, есть ли альтернативное решение проблемы?

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

1. Это мой первый пост, поэтому любые комментарии о лучших практиках приветствуются

2. Знаете ли вы, как вы можете вообще написать новый файл CSV (без учета шагов 2 и 3)?

3. Привет, на всякий случай, я полагаю, простой поиск и замена (‘Корея, южная’ -> ‘Южная Корея’) не подойдет?

4. Если термины там такие korea, south , то произошло то, что вам не хватает кавычек, поэтому, скорее всего, вам не следует объединять их, удаляя запятую, но оставьте запятую и добавьте кавычки вокруг двух терминов, например "korea, south" . Я вижу, что вы также указываете quotechar='"' , так что это должно работать просто отлично.

Ответ №1:

Сначала определите список ARRAY = [] , а затем, пока вы обрабатываете строки, добавьте их в этот массив

 search_terms1 = ["korea"]
search_terms2 = ["south"]

if any([term in row[1] for term in search_terms1]) and any([term in row[2] for term in search_terms2]):
    row[1] =  row[2]   row[1] # combie south and korea
    row.pop(2) # remove the 3rd element

ARRAY.append(row)
  

И затем вы можете записать файл снова

 with open("new_file.csv", "w") as f:
    for row in ARRAY: # Write each row
        f.write(", ".join(row))
        f.write("n") # add a new line
  

Я действительно не знаю, как csv.reader это работает, и могут быть некоторые функции, которые выполняют эту работу лучше, чем эта, но приведенный выше фрагмент должен работать просто отлично.

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

1. Почему бы просто не разделить массив?

2. Что значит разделить массив? Вы имеете в виду присоединиться? Теперь, когда я вижу f.write(", ".join(row)) , стало лучше.