Найти - Пользователи
Полная версия: Работа интерпретатора с файлами в IDE и без
Начало » Python для новичков » Работа интерпретатора с файлами в IDE и без
1
TwoGOOse
Добрый день!

Решил освоить обработку данных в 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 кб. Может натолкнет на мысль.

Вот, надеюсь на вашу помощь!
reclosedev
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)
TwoGOOse
reclosedev
Или с помощью with (который закроет файл) как по ссылке выше:

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

TwoGOOse
header = infile.__next__()
header = next(infile)
header = infile.readline()
TwoGOOse
py.user.next
reclosedev не указал кодировку при открытии файлов

не понял Ваших примеров.
Вместо моей строчки кода, вы предлагаете две альтернативы?
чем они отличаются?
какой лучше и почему?
cutwater
Отличаются они тем что методы __next__ и компания начинающиеся и заканчивающиеся с __ являются зарезервированными для внутреннего использования, их обычно дублируют встроенные функции такие как next и вызывать их явно зачастую не нужно. Кроме случаев, когда Вы четко знаете, что делаете.
reclosedev
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 не указал кодировку при открытии файлов
У ТС тоже не было, а угадать сложно
py.user.next
reclosedev
У ТС тоже не было, а угадать сложно
у него Python 3.3, а в третьем питоне для текстового режима её всегда нужно ставить

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