Уведомления

Группа в Telegram: @pythonsu

#1 Март 8, 2021 20:23:50

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как записать в новый файл csv отдельные колонки из другого файла

Всем привет, я пробую так

 def take_columns_from_csv():
       ##Open the file
    infile = open('D:\\proc\\sales_result_sliced.csv', 'r') 
    outfile = open('D:\\proc\\result.csv', 'w', newline='') 
    lines = infile.readlines()
    counter = 1
    for line in lines[0:]: #skip the first line, which is the header
        sline = line.strip() #get rid of trailing newline characters at the end of the line
        sline = sline.split(',')  # separates line into a list of items.  ',' tells it to split the lines at the commas
        #sline.append((counter, sline[0], sline[3])) 
        #print(sline)
        nameString = ', '.join((sline[0], sline[1])) 
        outfile.write(nameString)
        counter = counter + 1   	
    #close the file
    infile.close()
    outfile.close()

Но у меня все пишется в одну первую ячейку.
А нужно, чтобы каждую обработанную строку писало вниз после каждой, как в оригинале.

Офлайн

#2 Март 8, 2021 20:40:48

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как записать в новый файл csv отдельные колонки из другого файла

В целом, я только что научился это делать

 def take_head_of_file_four():
    with open('D:\\proc\\sales_result_sliced.csv', 'r', newline='') as csvfile, open("D:\\proc\\result.csv", "w", newline='') as out_file:
         reader = csv.DictReader(csvfile)
         writer = csv.writer(out_file)
         for row in reader:
             writer.writerow((row['Company Code'], row['Order Number']))

Но проблема в том, что я бы хотел видеть еще и заголовки, мочь их перенаименовывать, слева добавить нумерацию. От так.

Офлайн

#3 Март 8, 2021 21:24:37

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как записать в новый файл csv отдельные колонки из другого файла

Пробую подойти - так не получается вообще со скриптом

Падает

 def take_head_of_file_four():
    with open('D:\\proc\\sales_result_sliced.csv', 'r', newline='') as csvfile, open("D:\\proc\\result.csv", "w", newline='') as out_file:
         reader = csv.DictReader(csvfile)
         #fieldnames = ['Company Code', 'Order Number']
         fieldnames = ['Company Code', 'Order Number']
         writer = csv.DictWriter(out_file, fieldnames=fieldnames)
         writer.writeheader()
         for row in reader:
             writer.writerow((row['Company Code'], row['Order Number']))

Офлайн

#4 Март 8, 2021 21:42:23

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как записать в новый файл csv отдельные колонки из другого файла

Вообщем, получилась смесь, которую я решить пока не могу
Добавил счетчик для нумерации колонок слева
А заголовки выводить как - не могу понять. Хелп.

 def take_head_of_file_four():
    with open('D:\\proc\\sales_result_sliced.csv', 'r', newline='') as csvfile, open("D:\\proc\\result.csv", "w", newline='') as out_file:
         reader = csv.DictReader(csvfile)
         writer = csv.writer(out_file)
         counter = 1
         fieldnames = ['Company Code', 'Order Number']
         writer = csv.DictWriter(out_file, fieldnames=fieldnames)
         writer.writeheader()
         for row in reader:             
             writer.writerow((counter, row['Company Code'], row['Order Number']))
             counter +=1
    #close the file
    csvfile.close()
    out_file.close()

Офлайн

#5 Март 8, 2021 21:52:51

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9880
Репутация: +  853  -
Профиль   Отправить e-mail  

Как записать в новый файл csv отдельные колонки из другого файла

del



Отредактировано py.user.next (Март 8, 2021 22:01:44)

Офлайн

#6 Март 8, 2021 21:53:22

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как записать в новый файл csv отдельные колонки из другого файла

Работает, но не знаю, но код не умеет перенаименовывать заголовки

 def take_head_of_file_four():
    with open('D:\\proc\\sales_result_sliced.csv', 'r', newline='') as csvfile, open("D:\\proc\\result.csv", "w", newline='') as out_file:
         reader = csv.DictReader(csvfile)
         writer = csv.writer(out_file)
         counter = 1
         fieldnames = ['Company Code', 'Order Number']
         writer = csv.DictWriter(out_file, fieldnames=fieldnames)
         writer.writeheader()
         for row in reader:
             writer.writerow({'Company Code': row['Company Code'], 'Order Number': row['Order Number']})
             counter +=1
    #close the file
    csvfile.close()
    out_file.close() 

Можете помочь доработать?

Офлайн

#7 Март 8, 2021 22:01:50

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9880
Репутация: +  853  -
Профиль   Отправить e-mail  

Как записать в новый файл csv отдельные колонки из другого файла

Для работы с CSV в питоне используй модуль csv. Этот модуль знает, как устроены CSV данные и что в них может быть вообще. Даже ты не знаешь CSV настолько хорошо, как этот модуль. Поэтому отдай ему свои данные, он разберётся с ними правильно.

Пример использования модуля csv

  
>>> import csv
>>> import sys
>>> 
>>> writer = csv.writer(sys.stdout)
>>> writer.writerows([['header1', 'header2', 'header3'], [1, 2, 3], ['4', '5', '6'], [None, 'x', 123]])
header1,header2,header3
1,2,3
4,5,6
,x,123
>>>

Antonpython
А заголовки выводить как - не могу понять.
Заголовки в CSV-формате - это просто первая строка данных. Так что лучше их вообще убирать, так как они всегда будут мешать работать с данными чисто. На заголовке никогда не написано, что это заголовок, а не данные. Но если заголовки тебе нужны (для чтения базы данных через Excel или LibreOffice Writer), то можешь просто первую строку данных сформировать и записать через csv.write(). Ничем они от данных в этом плане не отличаются.

Если собрался менять базу данных, переведи CSV-данные в SQL-данные и используй для этого SQLite. Там у тебя будут и заголовки настоящие, и менять данные можно будет многими способами, и отыскивать среди них что-то, используя логические конструкции.



Офлайн

#8 Март 8, 2021 22:06:17

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как записать в новый файл csv отдельные колонки из другого файла

Вроде, что-то получилось

 def take_head_of_file_four():
    with open('D:\\proc\\sales_result_sliced.csv', 'r', newline='') as csvfile, open("D:\\proc\\result.csv", "w", newline='') as out_file:
         reader = csv.DictReader(csvfile)
         fieldnames = ['','Company', 'Order Number']
         writer = csv.DictWriter(out_file, fieldnames=fieldnames)
         counter = 1
         writer.writeheader()
         for row in reader:
             writer.writerow({'': counter, 'Company': row['Company Code'], 'Order Number': row['Order Number']})
             counter +=1
    #close the files
    csvfile.close()
    out_file.close()

Проверьте меня на “говнокод”
И предложите, пожалуйста, какие-то более классные решения - у меня ощущения, что я слепил решение из говна и палок.
Спасибо.

Офлайн

#9 Март 8, 2021 22:11:46

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как записать в новый файл csv отдельные колонки из другого файла

И как вообще взять каждую колонку, оставить только уникальные значения, отсортировать их по возрастанию слева добавить нумерацию и, типа, только потом записать?

Могу в следующую тему забросить.
Спасибо.

Офлайн

#10 Март 8, 2021 23:24:02

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Как записать в новый файл csv отдельные колонки из другого файла

Antonpython
Проверьте меня на “говнокод”
Если открыли файл с with то close не нужен.
Для создания счетчика есть enumerate
 for counter,obj  in enumerate(collectio):
 .....
Antonpython
И как вообще взять каждую колонку, оставить только уникальные значения, отсортировать их по возрастанию слева добавить нумерацию и

Ваш подход очень напоминает подход эклелистов, которые все воспринимают как таблицы. В питоне используются другие, гораздо более мощные структуры данных. То что вы выражаете словами колонка, строка отсортировать пронумеровать удалить дубликаты в питоне выражается другими концепциями классами словарями списками множествами. При работе с питоном в большинстве случаев гораздо удобнее держать объекты в памяти. Если нужно то модулем pickle всегда можно в паре строк сохранить или восстановить данные. Если надо красиво вывести данные для пользователя то их выводят с форматированием в html или pdf формате.

Простейший пример:
 data={"IBM":{"cost":20,"some":True},
           "GOOGLE":{"cost":30,"some":False},
}
Если вы привыкли держать данные в выражениях питона то:
В примере уникальность получается потому что в dict ключи уникальны.
Сортировка для чего вам? Если для ускорения поиска, то она не имеет смысла, питон сам быстро находит данные по ключам. Если для запросов диапазонов, то это другое дело.
Нумерация вообще не имеет смысла, ее легко получить при помощи enumerate Только вот тоже зачем???

Ну и так далее…

А если надо реально с таблицами работать так ведь есть sqlite3. Там есть нужные вам слова, uniqie, ordered by, autoincrement




Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version