Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 22, 2016 11:11:13

coffe4wolf
Зарегистрирован: 2016-04-21
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись и выборка строк в CSV

В рамках изучения языка поставил себе практически полезную задачку.
Дан файл CSV с таблицей:
В первом столбце фамилии сотрудников с инициалами. Во втором столбце указывается время прихода сотрудника на работу, в третьем время ухода.

ФИО Первый приход Последний уход
Boscolo L.

Munhos de Campos E.

Абашидзе А.А.
.
.
.
Андросова А.Ю. 10.02.2014 14:09 16.04.2014 15:48
.

Записей в таблице больше 1000, необходимо выбрать из таблицы только те строки, в которых есть время прихода и ухода (их штук 10-15 из тысячи).
Нашёл модуль CSV, для работы с файлами данного формата, но не всё идёт гладко.
В планах выбирать подходящие под условие строки (есть значения в трёх колонках(фио, время прихода, время ухода) и записывать их в новый CSV файл.

Для начала решил попытаться записать все строки из входящего файла в новый

import csv
input_file = open('testcsv.csv','rt')
reader = csv.reader(input_file)
output_file = open('output.csv','wt')
writer = csv.writer(output_file)
for row in reader:
    writer.writerow(row)
Код работает, но появились вопросы.
1. Не могу ограничить количество записываемых строк. В качестве тестового костыля попробовал поставить условие
if int(row) == 1000:
    break
Однако IDLE ругается на то, что row невозможно перевести в int, так как он является списком.
Попробовал вывести через print(row), вывел он мне "". Отсюда второй вопрос
2. Как получился такой итерируемый объект, откуда он взял такой список и как с ним управляться?
3. Строки в CSV файлах по какой-то причине пишутся через строку:
Строка со значением
Пустая строка
Строка со значением

Однако при записи всех строк из одного файла в другой он записывает и пустые строки. В итоге получается
Строка со значением
Пустая строка
Пустая строка
Строка со значением

Почему он так делает и возможно ли вести запись не через строку, а в каждой строке? Или нужно будет отрезать пустые строки при выборке?

Отредактировано coffe4wolf (Апрель 22, 2016 11:14:30)

Офлайн

#2 Апрель 22, 2016 11:37:32

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Запись и выборка строк в CSV

coffe4wolf
1)

for n, row in enumerate(reader, 1):
    if n == 1000:
        break
пример выше считает строки подряд. Если хотите условие то добавьте перемнную, которую будуте инкрементировать при каждом его срабатывании

и
len(row) вместо int(row)

2) ридер читает построчно файл, разбивает строку по разделителю и выплевывает вам список значений
3) виндовый перенос строки, решается добалением параметра lineterminator='\n' к csv.writer

Отредактировано sander (Апрель 22, 2016 11:39:31)

Офлайн

#3 Апрель 22, 2016 14:20:31

coffe4wolf
Зарегистрирован: 2016-04-21
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись и выборка строк в CSV

sander
Огромное спасибо, с этим разобрался. Заодно вспомнил, что записываемый файл нужно закрывать после работы ) Кстати возник вопрос - читаемый файл сам закрывается кода к нему заканчиваются обращения?

Офлайн

#4 Апрель 22, 2016 14:26:40

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Запись и выборка строк в CSV

coffe4wolf
да, когда нибудь закроется, но лучше использовать менеджеры контекста

with open("filename") as f:
    # do something
    # file opened
выход из менеджера
# file closed

Офлайн

#5 Май 10, 2016 13:21:46

Kagalar
Зарегистрирован: 2016-05-10
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись и выборка строк в CSV

Всё по работе с форматом CSV, можно найти здесь

Офлайн

#6 Май 10, 2016 14:38:26

coffe4wolf
Зарегистрирован: 2016-04-21
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись и выборка строк в CSV

sander
Переписал с использованием менеджеров контекста

with open('testcsv.csv','rt') as input_file:
    reader = csv.reader(input_file)
    for row in reader:
        if len(row) != None:
            with open('output.csv','wt') as output_file:
                writer = csv.writer(output_file)
                writer.writerow(row)
        else:
            break
output_file.close()
Однако если раньше скрипт хотя бы тупо копировал строки из одного файла в другой, то теперь просто создаёт пустой csv.
Попробовал сделать вывод в консоль
with open('testcsv.csv','rt') as input_file:
reader = csv.reader(input_file)
for row in reader:
if len(row) != None:
print(row)
else:
break
И всё содержимое файла testcsv.csv вывелось в консоль, следовательно проблема во втором менеджере контекста, но пока не могу понять что именно не так.

Отредактировано coffe4wolf (Май 10, 2016 14:47:05)

Офлайн

#7 Май 10, 2016 15:24:51

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Запись и выборка строк в CSV

coffe4wolf
1) len(что то там) никогда не будет = None
2) writer.writerow ждет на вход список строк, а не строку
3) вынеси создание файла “output_file” из цикла


Офлайн

#8 Май 10, 2016 15:41:36

r00tl3ss
Зарегистрирован: 2016-03-31
Сообщения: 25
Репутация: +  5  -
Профиль   Отправить e-mail  

Запись и выборка строк в CSV

1. Можно сделать вот так:

with open('testcsv.csv','rt') as input_file, open('output.csv', 'w') as output_file:
...
2. Вот эту инструкцию выполнять не обязательно, т.к. при выходе из контекста она выполнится автоматически:
output_file.close()

Отредактировано r00tl3ss (Май 10, 2016 15:45:32)

Офлайн

#9 Май 10, 2016 20:59:24

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

Запись и выборка строк в CSV

coffe4wolf
Дан файл CSV с таблицей:
coffe4wolf
Абашидзе А.А.
Андросова А.Ю. 10.02.2014 14:09 16.04.2014 15:48
формально это не csv файл поскольку разделители не запятые.
формально это не таблица, поскольку у вас может быть разное количество элементов в строке.

Следовательно выбор CSV ридера в качестве инструмента неудачен.

import re
print(re.findall("^.+\d$",open("a.txt").read(), re.M))

Я бы еще рекомендовал явно указать кодировку файлов.




Офлайн

#10 Май 11, 2016 10:53:51

coffe4wolf
Зарегистрирован: 2016-04-21
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись и выборка строк в CSV

doza_and

[code python]
print(re.findall("^.+\d$",open("a.txt").read(), re.M))
[/code]
Чем является третий аргумент ‘re.M’? Гугл с документацией не сказали мне ничего конкретного насчёт него, хотя может и плохо искал.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version