Найти - Пользователи
Полная версия: Запись и выборка строк в CSV
Начало » Центр помощи » Запись и выборка строк в CSV
1 2
coffe4wolf
В рамках изучения языка поставил себе практически полезную задачку.
Дан файл 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 файлах по какой-то причине пишутся через строку:
Строка со значением
Пустая строка
Строка со значением

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

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

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

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

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

coffe4wolf
sander
Огромное спасибо, с этим разобрался. Заодно вспомнил, что записываемый файл нужно закрывать после работы ) Кстати возник вопрос - читаемый файл сам закрывается кода к нему заканчиваются обращения?
sander
coffe4wolf
да, когда нибудь закроется, но лучше использовать менеджеры контекста
with open("filename") as f:
    # do something
    # file opened
выход из менеджера
# file closed
Kagalar
Всё по работе с форматом CSV, можно найти здесь
coffe4wolf
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 вывелось в консоль, следовательно проблема во втором менеджере контекста, но пока не могу понять что именно не так.
sander
coffe4wolf
1) len(что то там) никогда не будет = None
2) writer.writerow ждет на вход список строк, а не строку
3) вынеси создание файла “output_file” из цикла


r00tl3ss
1. Можно сделать вот так:
with open('testcsv.csv','rt') as input_file, open('output.csv', 'w') as output_file:
...
2. Вот эту инструкцию выполнять не обязательно, т.к. при выходе из контекста она выполнится автоматически:
output_file.close()
doza_and
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))

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


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