Найти - Пользователи
Полная версия: Как записать в новый файл csv отдельные колонки из другого файла
Начало » Python для новичков » Как записать в новый файл csv отдельные колонки из другого файла
1 2
Antonpython
Всем привет, я пробую так

 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()

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

 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']))

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

Падает

 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']))
Antonpython
Вообщем, получилась смесь, которую я решить пока не могу
Добавил счетчик для нумерации колонок слева
А заголовки выводить как - не могу понять. Хелп.

 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()
py.user.next
del
Antonpython
Работает, но не знаю, но код не умеет перенаименовывать заголовки
 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() 

Можете помочь доработать?
py.user.next
Для работы с 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. Там у тебя будут и заголовки настоящие, и менять данные можно будет многими способами, и отыскивать среди них что-то, используя логические конструкции.
Antonpython
Вроде, что-то получилось

 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()

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

Могу в следующую тему забросить.
Спасибо.
doza_and
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


This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB