Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 16, 2012 09:50:51

TwoGOOse
Зарегистрирован: 2012-11-15
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа интерпретатора с файлами в IDE и без

Добрый день!

Решил освоить обработку данных в Python и столкнулся с трудностями.
Win7x86, Python33.
исходные файлы доступны для скачивания по следующим ссылкам
http://dl.dropbox.com/u/80844621/PyWinG.py - скрипт с ниже приведенным текстом
http://dl.dropbox.com/u/80844621/test.csv - исходный файл для обработки

Задача следующая.

Беру файл test.csv (разделитель ‘,’).
убираю строчку с названием столбцов.

import csv as csv
test_file_object = csv.reader(open('test.csv', 'r'))
header = test_file_object.__next__()

Дальше создаю новый файл и копирую туда строки из test.csv с дополнительным полем вначале.
open_file_object = csv.writer(open('pyOne.csv', 'w'))
for row in test_file_object:
    if row[2] == 'female':
        row.insert(0,'1')
        open_file_object.writerow(row)
    else:
        row.insert(0,'0')
        open_file_object.writerow(row)

Запускай, интерпретатор отрабатывает синтаксис, ок.

ПРОБЛЕМЫ:
В исходном файле 419 строк с информацией.
Если я запускаю скрипт из IDLE (допустим IDLE (Python GUI)) то получаемый файл pyOne.csv
весит 25 кб и содержит только информацию о 370 строках, причем после каждой строки с информацией
вставляется пустая строка?! Как это выглядит показано на картинках



Если я запускаю скрипт просто двойным щелчков по нему, то выходной файл 28 кб и содержит
информацию о 418 строках (столько сколько нужно). Но, опять же, после каждой информационной строки стоит пустая строка (файл на 418*2 строк итоговый, приходится макросом офисе их убирать уже, чего не хотелось бы делать).

ВОПРОСЫ:
Как не писать пустые строки в выходной файл csv.
Как закрывать файл после запуска скрипта из IDLE, так как пока она запущена, файл доступен только на чтение.

ЧТО Я УЖЕ ДЕЛАЛ:
Проблемы обнаружились когда я писал в PyScript на интерпретаторе Python32. Я поставил IDLE WingIDE 1016, не помогло. Я удалил все IDLE с системы, удалил Python32 и все почистил. Я поставил сегодня Python33 и ситуация повторилась.
*Я сменил в PyScript интерпретатор на внутренний и после первого запуска выдавался файл 25кб, а
“тупо” после повторного 28 кб. Может натолкнет на мысль.

Вот, надеюсь на вашу помощь!

Отредактировано TwoGOOse (Ноя. 16, 2012 11:46:54)

Прикреплённый файлы:
attachment test.csv (26,0 KБ)

Офлайн

#2 Ноя. 16, 2012 10:40:07

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Работа интерпретатора с файлами в IDE и без

TwoGOOse
Как не писать пустые строки в выходной файл csv.
Для работы с csv, файл нужно открывать с параметром newline='' (в Python 2.7 в бинарном режиме)
http://docs.python.org/3.3/library/csv.html#csv.reader

TwoGOOse
Как закрывать файл после запуска скрипта из IDLE, так как пока она запущена, файл доступен только на чтение.
Для этого нужно открывать файловый объект отдельно, передавать его в reader, а потом закрывать:
csvfile = open('test.csv', newline='')
reader = csv.reader(csvfile)
...
csvfile.close()
Или с помощью with (который закроет файл) как по ссылке выше:
with open('test.csv', newline='') as infile, open('pyOne.csv', 'w', newline='') as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile)
    for row in reader:
        ...
        writer.writerow(row)

Отредактировано reclosedev (Ноя. 16, 2012 10:40:25)

Офлайн

#3 Ноя. 16, 2012 11:45:59

TwoGOOse
Зарегистрирован: 2012-11-15
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа интерпретатора с файлами в IDE и без

reclosedev
Или с помощью with (который закроет файл) как по ссылке выше:

Спасибо, все работает! (добавил только перед for строчку ‘ header = infile.__next__()’)
Пару вопросов в догонку, чем отличается import csv as csv от вашего import csv

Офлайн

#4 Ноя. 16, 2012 12:11:55

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

Работа интерпретатора с файлами в IDE и без

reclosedev не указал кодировку при открытии файлов

TwoGOOse
header = infile.__next__()
header = next(infile)
header = infile.readline()



Офлайн

#5 Ноя. 16, 2012 12:13:49

TwoGOOse
Зарегистрирован: 2012-11-15
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа интерпретатора с файлами в IDE и без

py.user.next
reclosedev не указал кодировку при открытии файлов

не понял Ваших примеров.
Вместо моей строчки кода, вы предлагаете две альтернативы?
чем они отличаются?
какой лучше и почему?

Офлайн

#6 Ноя. 16, 2012 14:55:33

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Работа интерпретатора с файлами в IDE и без

Отличаются они тем что методы __next__ и компания начинающиеся и заканчивающиеся с __ являются зарезервированными для внутреннего использования, их обычно дублируют встроенные функции такие как next и вызывать их явно зачастую не нужно. Кроме случаев, когда Вы четко знаете, что делаете.



Офлайн

#7 Ноя. 16, 2012 14:59:30

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Работа интерпретатора с файлами в IDE и без

TwoGOOse
чем отличается import csv as csv от вашего import csv
“import something as name” обычно используется для того, чтобы задать другое имя модулю, например, более короткое или совместимое с существующим кодом:
import numpy as np
import csv просто импортирует модуль csv под именем csv.
TwoGOOse
не понял Ваших примеров.
Вместо моей строчки кода, вы предлагаете две альтернативы?
чем они отличаются?
какой лучше и почему?
__next__ - “низкоуровневый” метод, в коде лучше использовать:
header = next(reader)
header = next(infile)
header = infile.readline()
что больше нравится.

py.user.next
reclosedev не указал кодировку при открытии файлов
У ТС тоже не было, а угадать сложно

Офлайн

#8 Ноя. 17, 2012 02:09:19

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

Работа интерпретатора с файлами в IDE и без

reclosedev
У ТС тоже не было, а угадать сложно
у него Python 3.3, а в третьем питоне для текстового режима её всегда нужно ставить

TwoGOOse
какой лучше и почему?
лучше .readline() потому что import this
но они не эквивалентны (вдруг нужно исключение)
для эквивалентности можно делать next(fin, ''), но преимуществ перед .readline() нет, вроде



Отредактировано py.user.next (Ноя. 17, 2012 02:13:30)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version