Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.97/35: Рейтинг темы: голосов - 35, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 10
1

CSV файлы

05.02.2015, 17:44. Просмотров 7286. Ответов 19
Метки нет (Все метки)


Добрый день уважаемые форумчан) Недавно начала писать диплом для защиты бакалавриата,соответственно возникла куча проблем, одна из них написание кода на python-е. С питоном я слабо знаком, поэтому прошу у вас любой помощи в моём нелёгком деле )
Задача такая: есть два файла с расширением CSV,соответственно все данные в нём записаны через запятую,в табличном виде. У этой таблицы есть шапка (время,скорость,диапазон,ну и т.д. и т.п.),а под шапкой числа. Моя задача найти в шапке определенные слова и перезаписать их (например найти слово скорость и вместо него написать speed). Это была первая проблема.
Вторая проблема:допустим у нас два CSV файла в таком виде, первый файл имеет например значения в диапазоне от 1 до 2, а второй от 1,5 до 4. Моя задача создать третий файл куда я помещу значения из первого файла от 1 до 2 ,и отсортировав второй от 2 до 4 значения из второго файла. Т.е. грубо говоря мне надо сшить оба файла.

Вот такие вот дела... Не думайте что я пишу сюда не прочитав кучу литературы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2015, 17:44
Ответы с готовыми решениями:

Обратиться к файлу в папке через CSV модуль и Параметры CSV
Доброго времени суток, я чувствую что решение проблемы простое, но никак не могу найти решение в...

Найти все RTF файлы, захешировать эти файлы MD5 и SHA1. Потов захешированые файлы поместить в документ
Найти все RTF файлы, захешировать эти файлы MD5 и SHA1. Потов захешированые файлы поместить в...

Csv файлы
Здравствуйте, у меня задача понять как можно создавать csv файлы со степерями вложенности, то есть,...

Как из строк csv-файла сделать xml-файлы?
Добрый день. Столкнулся в проблемой парсинга csv файла и созданием конфигурационных файлов по...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы Fullstack-разработчиков на Python
19
3239 / 2047 / 350
Регистрация: 24.11.2012
Сообщений: 4,897
05.02.2015, 17:55 2
Что конкретно не получается?
0
Эксперт Python
4444 / 1879 / 342
Регистрация: 17.03.2012
Сообщений: 9,668
Записей в блоге: 5
06.02.2015, 08:32 3
Да, надо бы конкретизировать.
Для обработки csv в питоне есть одноимённый модуль, есть ещё asciitable.
Для работы с числами есть сторонняя библиотека numpy, считывание и запись в такие файлы там тоже имеется.
0
0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 10
11.02.2015, 00:55  [ТС] 4
Извините за поздний ответ. Вообщем,что я уже научился делать:
Python
1
2
3
4
5
6
7
8
9
import csv
c=csv.writer(open("file1.csv","w",newline=' '))
c.writerow(["Time","Date","LaserCurrent","Diode1","Diode32","Diode64"])
with open ("file2.csv","r",newline=' ') as  csvfile:
    reader=csv.DictReader (csvfile)
    data=[r for r in csv.reader(csvfile)]
with open ("file1.csv","r",newline=' ') as  outfile:
    for r in data:
      outfile.write ('%s,%s\n'%(r[0], r[2]))
Заранее прошу строго не судить(я имею ввиду за то что текст в ручную вбивал).
Попытаюсь пояснить,что я пытаюсь сделать. Есть два файла: первый file1 это тот который я создаю и сразу же вбиваю шапку -(["Time","Date","LaserCurrent","Diode1","Diode32","Diode64 "])
Есть второй файл file 2 в котором вбиты нужные мне диапазоны,т.е. что то типа такого (["2-3","3-5",...,"995-1000"])
1) открываю(создаю) для записи первый файл и вручную вбиваю шапку
2) открываю второй файл и считываю данные из него(т.е. в данном случае мои данные это диапазоны)
3)пытаюсь сшить их ,т.е. к шапке прикрепить диапазоны,чтобы получилось (["Time","Date","LaserCurrent","Diode1","Diode32","Diode64 ","2-3","3-5",...,"995-1000"])

НО тот код что я написал не делает того что я хочу,потому что я пытаюсь на примере других программ сделать то что мне нужно,путём копипаста,проб и ошибок.

Это как я пытаюсь сделать. Так как я с программированием совсем не дружу, мой метод весьма ужасен. Буду весьма благодарен если подскажете идею. Моя задача: при компиляции проги должен создаваться файл,в котором будет эта шапка и диапазоны (я к тому что эти диапазоны не обязательно брать из file2, наверняка для них можно написать цикл), но я совсем хреново прогаю как вы уже это поняли и для меня это лес дремучий. Если вы дочитали до этого места, спасибо за трату вашего времени и за возможную помощь.
0
Эксперт Python
4444 / 1879 / 342
Регистрация: 17.03.2012
Сообщений: 9,668
Записей в блоге: 5
11.02.2015, 07:48 5
Ничего не понял.
Давайте так, вы изложите всё вкратце, заострив внимание на главное и отбросив второстепенное.
Главное - что вы получаете на вход (какие файлы), и что нужно на выходе.
Второстепенное - это каким образом у вас оказываются входные данные, это нам ни к чему.

По входным файлам пока непонятно, а действительно ли у вас csv, может, там просто однострочные файлы.
По выходным - непонятно, что это. То ли список (в памяти), то ли новый файл. Слово "прикрепить" это не раскрывает.

Желательно с примером.
0
0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 10
11.02.2015, 12:34  [ТС] 6
1 проблема: на входе два файла(именно csv). В первом допустим таблица (матрица 1 на 3) - [1;2;3].
Во втором файле матрица 1 на 100(но вместо чисел-диапазоны) - [0.5-1.0;1.0-1.5;1.5-2.0;...;49.5-50.0]
На выходе должен получить матрицу 1 на 103 -[1;2;3;0.5-1.0;1.0-1.5;1.5-2.0;...;49.5-50.0].
2 проблема: допустим у меня нету ни первого файла ни второго, тогда как мне написать программу которая бы создавала отдельный csv файл, в который бы сама(я имею ввиду программу) вбивала бы [1;2;3;0.5-1.0;1.0-1.5;1.5-2.0;...;49.5-50.0].
Я уже умею создавать csv файл и вбивать [1;2;3] ,но я не знаю как создать цыкал который с определённой клетки вбил бы мне диапазоны [0.5-1.0;1.0-1.5;1.5-2.0;...;49.5-50.0]
3 проблема : Теперь допустим мы справились с проблемой 1 и проблемой 2. Давайте представим что у нас есть программа при запуске которой у нас появляется csv файл в котором вбита матрица 1x105 . Теперь мне нужно прочесть имеющийся у меня csv файл с данными, данные выглядят как таблица 40x40,где все значения идут через запятую, и выдернуть от туда определённый столбик вставив его в создаваемый файл. Попробую вкратце объяснить )
На входе файл1 - таблица 40x40. На выходе файл с вот такой вот шапкой [1;2;3;0.5-1.0;1.0-1.5;1.5-2.0;...;49.5-50.0] и выдернутый из файла 1 столбец который я прикреплю под диапазоном.
Вообщем готов пояснять ещё много много раз,потому что эти проблемы не дают мне покоя.
Я поговорил со знакомым,он посоветовал библиотеку numpy, доки питоновские на сайте почитать. Вообщем сейчас занимаюсь самообучением )
0
Эксперт Python
4444 / 1879 / 342
Регистрация: 17.03.2012
Сообщений: 9,668
Записей в блоге: 5
11.02.2015, 12:51 7
Цитата Сообщение от iCenturion Посмотреть сообщение
1 проблема: на входе два файла(именно csv). В первом допустим таблица (матрица 1 на 3) - [1;2;3].
Считать первую строку, пример.
Python
1
2
f = open('d:\\temp\\csv1.csv')
str1 = f.readline()
Две строки считали, сшили.
Вывод.
Python
1
2
f1 = open('d:\\temp\csvout.csv', 'w')
f1.write(str1 + ';' + str2)
csv тут не нужен, для первой задачи. Просто считать по одной строке из файлов и вывести в третий.

Вторую не буду. Извините, устал продираться и выяснять, что же вам надо.
0
0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 10
12.02.2015, 12:38  [ТС] 8
dondublon, а что именно не понятно во второй проблеме ?
0
3239 / 2047 / 350
Регистрация: 24.11.2012
Сообщений: 4,897
12.02.2015, 13:33 9
Цитата Сообщение от iCenturion Посмотреть сообщение
я не знаю как создать цыкал который с определённой клетки вбил бы мне диапазоны
Python
1
2
3
>>> import numpy as np
>>> '1;2;3;' + ';'.join('{}-{}'.format(item, item + 0.5) for item in np.arange(0.5, 50, 0.5))
'1;2;3;0.5-1.0;1.0-1.5;1.5-2.0;2.0-2.5;2.5-3.0;3.0-3.5;3.5-4.0;4.0-4.5;4.5-5.0;5.0-5.5;5.5-6.0;6.0-6.5;6.5-7.0;7.0-7.5;7.5-8.0;8.0-8.5;8.5-9.0;9.0-9.5;9.5-10.0;10.0-10.5;10.5-11.0;11.0-11.5;11.5-12.0;12.0-12.5;12.5-13.0;13.0-13.5;13.5-14.0;14.0-14.5;14.5-15.0;15.0-15.5;15.5-16.0;16.0-16.5;16.5-17.0;17.0-17.5;17.5-18.0;18.0-18.5;18.5-19.0;19.0-19.5;19.5-20.0;20.0-20.5;20.5-21.0;21.0-21.5;21.5-22.0;22.0-22.5;22.5-23.0;23.0-23.5;23.5-24.0;24.0-24.5;24.5-25.0;25.0-25.5;25.5-26.0;26.0-26.5;26.5-27.0;27.0-27.5;27.5-28.0;28.0-28.5;28.5-29.0;29.0-29.5;29.5-30.0;30.0-30.5;30.5-31.0;31.0-31.5;31.5-32.0;32.0-32.5;32.5-33.0;33.0-33.5;33.5-34.0;34.0-34.5;34.5-35.0;35.0-35.5;35.5-36.0;36.0-36.5;36.5-37.0;37.0-37.5;37.5-38.0;38.0-38.5;38.5-39.0;39.0-39.5;39.5-40.0;40.0-40.5;40.5-41.0;41.0-41.5;41.5-42.0;42.0-42.5;42.5-43.0;43.0-43.5;43.5-44.0;44.0-44.5;44.5-45.0;45.0-45.5;45.5-46.0;46.0-46.5;46.5-47.0;47.0-47.5;47.5-48.0;48.0-48.5;48.5-49.0;49.0-49.5;49.5-50.0'
Запись в файл — как обычно.
0
0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 10
12.02.2015, 19:24  [ТС] 10
0x10, спасибо тебе большое, вот просто слов нету, очень помог. Подскажи что можно почитать,чтобы самому допереть до вопросов подобных этому.

Добавлено через 59 секунд
0x10, и если не трудно,можно какие нибудь идеи на счёт 3ей проблемы ?
0
3239 / 2047 / 350
Регистрация: 24.11.2012
Сообщений: 4,897
12.02.2015, 19:38 11
Цитата Сообщение от iCenturion Посмотреть сообщение
Подскажи что можно почитать,чтобы самому допереть до вопросов подобных этому.
Любую книжку по питону. В данном случае еще базовые доки numpy. Хотя то же самое можно было написать и обычным циклом, просто мне лень.
Цитата Сообщение от iCenturion Посмотреть сообщение
и если не трудно,можно какие нибудь идеи на счёт 3ей проблемы ?
Там нужно просто из матрицы взять конкретный столбец. Опять же, можно простой цикл написать, можно сделать срез numpy'ем:
Python
1
2
3
4
5
6
7
8
9
10
11
12
>>> import numpy as np
>>> arr = np.array([
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [4, 3, 2, 1]
... ])
>>> arr[:,1]
array([2, 6, 3])
>>> arr[:,2]
array([3, 7, 2])
>>> arr[:,3]
array([4, 8, 1])
В общем, тут никаких специальных знаний.
0
0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 10
14.02.2015, 23:03  [ТС] 12
0x10, пасиб
0
0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 10
16.02.2015, 12:51  [ТС] 13
0x10, возникла проблема
нужно чтобы все диапазоны записывались в отдельные клетки, т.е. 1;2;3;0.5-1;1-1.5;
где ; переход от одной клетки к другой
а у меня получается что все диапазоны записываются в одну клетку через запятую
выручай
0
3239 / 2047 / 350
Регистрация: 24.11.2012
Сообщений: 4,897
16.02.2015, 12:56 14
Цитата Сообщение от iCenturion Посмотреть сообщение
а у меня получается что все диапазоны записываются в одну клетку через запятую
Код в студию.
0
0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 10
16.02.2015, 14:11  [ТС] 15
0x10, есть ли у тебя скайп или вконтакте/ может вибер.
Python
1
2
3
4
import csv
import numpy as np
c=csv.writer(open("C:\\Documents and Settings\\Admin\\Рабочий стол\\mainFile.csv","w",newline=''))
c.writerow(["1","2","3",','.join("{}-{}".format(item, item + 0.5) for item in np.arange(0.5, 50, 0.5))])
Добавлено через 6 минут
0x10, я пытался создать цикл типа :
Python
1
2
3
4
5
i=0
for i :
 if i!=45.5:
  item=i
  i=i+0.5
но блин ... я потом понял что цикл одновременно с записью в файл не будет работать
теперь мне кажется, что программисты просто творят магию ) которой мне не обучится

Добавлено через 18 секунд
0x10,
Python
1
2
3
4
5
6
7
8
9
10
11
12
import csv
import numpy as np
c=csv.writer(open("C:\\Documents and Settings\\Admin\\Рабочий стол\\mainFile.csv","a",newline=''))
c.writerow(["1","2","3"])
i=0
for element in c:
    if i!=45.5:
        c.writerow([','.join("{}-{}".format(i, i+ 0.5))])
        i+=0.5
        
    else: 
        break
не получается =(
0
3239 / 2047 / 350
Регистрация: 24.11.2012
Сообщений: 4,897
16.02.2015, 14:32 16
1. Код в теги.
2. Метод бездумной копипасты не работает.
Python
1
2
3
4
5
6
7
8
9
10
11
import csv
import numpy as np
 
 
class CsvDialect:
    delimiter = ';'
 
 
c = csv.writer(open("test.csv","w"), dialect=CsvDialect)
c.writerow(["1", "2", "3"] + ["{}-{}".format(item, item + 0.5)
                              for item in np.arange(0.5, 50, 0.5)])
1
0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 10
16.02.2015, 14:55  [ТС] 17
0x10,
да я не тупо копипащу (хотя по началу так и делал,пытаясь получить хоть что то)
Смотри что у меня уже получилось
Python
1
2
3
4
5
6
7
import csv
import numpy as np
i=0
while i!=50:
        c=csv.writer(open("C:\\Documents and Settings\\Admin\\Рабочий стол\\mainFile.csv","a",newline=''))
        c.writerow([''.join("{}-{}".format(i, i+ 0.5))])
        i+=0.5
Результат это все диапазоны записанные в столбик,а мне нужно в строку. Ну и помимо этого я начинаю запись в цикле поэтому я не могу туда же в цикл воткнуть c.writerow(["1","2","3"]) .
Т.е. осталось два вопроса:
1) как сделать так чтобы в строку все диапазоны записались
2) как сделать так чтобы пред циклом создавался файл с (["1","2","3"]). Есть идея открыть файл для записи записать туда(1,2,3). Закрыть его ,а потом пустить цикл. Может ты подскажешь что нибудь по разумнее.
Спасиб тебе большое что поомогаешь )

Добавлено через 4 минуты
0x10, я попробовал реализовать свою идею "Есть идея открыть файл для записи записать туда(1,2,3). Закрыть его ,а потом пустить цикл.". У меня получился вот такой вот файл на выходе: в первой строке 1,2,3. А начиная со второй строки в первый столбец записались все диапазоны. Если честно в голову ничего не приходит как эти диапазоны заставить вписаться в строку после 1,2,3=(

Добавлено через 4 минуты
твой код даёт тот же результат - в первую ячейку забиваются и диапазоны и (1,2,3) ,т.е. 1,2,3,0.5-1,1-1.5,...
0
3239 / 2047 / 350
Регистрация: 24.11.2012
Сообщений: 4,897
16.02.2015, 18:15 18
Цитата Сообщение от iCenturion Посмотреть сообщение
твой код даёт тот же результат - в первую ячейку забиваются и диапазоны и (1,2,3) ,т.е. 1,2,3,0.5-1,1-1.5
Либо выполняешь не мой код, либо смотришь не в тот выходной файл.

Я не понимаю откуда и по какой логике возникают идеи вроде
Цитата Сообщение от iCenturion Посмотреть сообщение
открыть файл для записи записать туда(1,2,3). Закрыть его ,а потом пустить цикл.
Цитата Сообщение от iCenturion Посмотреть сообщение
Может ты подскажешь что нибудь по разумнее.
В теме уже есть два рабочих решения в постах 9 и 16.
0
0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 10
17.02.2015, 13:04  [ТС] 19
0x10, твой код не менял ситуацию(я имею ввиду все диапазоны записываются в одну клеточку,это если открыть csv в excele ), я погуглил и надыбал инфу про dialect=CsvDialect. Поменял на dialect='excel' и заработало ) спасибо за помощь
0
3239 / 2047 / 350
Регистрация: 24.11.2012
Сообщений: 4,897
17.02.2015, 13:14 20
Цитата Сообщение от iCenturion Посмотреть сообщение
все диапазоны записываются в одну клеточку,это если открыть csv в excele
Фейспалм...
1. За эксель не отвечу, но альтернативные офисные пакеты при открытии csv файла позволяют указать какой символ использовать в качестве разделителя.
2. В первом посте требовалось в качестве разделителя использовать точку с запятой, в 15 посте почему-то запятая. Я решил, что проблема в этом, заменил на точку с запятой, а в качестве фидбека получил вывод якобы с запятой:
Цитата Сообщение от iCenturion Посмотреть сообщение
твой код даёт тот же результат - в первую ячейку забиваются и диапазоны и (1,2,3) ,т.е. 1,2,3,0.5-1,1-1.5
В общем, не надо вносить путаницу на ровном месте.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.02.2015, 13:14

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

Удалить дубликаты, перед этим объединив csv файлы
Есть csv файлы, пусть будет три штуки, пот 20 тыщ строк, каждая строка содержит имя человека,...

CSV файлы
Здравствуйте, на входе есть csv файл, либо (как вариант) строковая переменная, содержащая уже...

При объединении файлы csv
Нашел макрос для объединения файлов, при выполнении конечный файл пуст. в чем дело. пробывал даже...

Запись output скрипта в csv-файлы
Добрый день! Гуру powershell, помогите! Есть скрипт, который забирает нужные Event Log с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.