Используя “с” оператором для файлов CSV в Python

Преобразование в JAVA довольно простое, но нужно некоторое понимание. Как поясняют в JLS для целых операций :

Если целочисленный оператор, отличный от оператора сдвига, имеет хотя бы один операнд типа long, то операция выполняется используя 64-битную точность, а результат численного оператора имеет тип long. Если другой операнд не длинный, он сначала расширяется (§5.1.5), чтобы печатать длинным путем численного продвижения (§5.6).

blockquote>

И пример всегда лучший способ перевести JLS;)

int + long -> long
int(1) + long(2) + int(3) -> long(1+2) + long(3)

В противном случае операция выполняется с использованием 32-битной точности , а результат численного оператора имеет тип int. Если какой-либо операнд не является int, он сначала расширен, чтобы вводить int посредством числовой рекламы.

blockquote>
short + int -> int + int -> int

Небольшой пример использования Eclipse, чтобы показать, что даже добавление двух short s не будет таким простым:

short s = 1;
s = s + s; <- Compiling error

//possible loss of precision
//  required: short
//  found:    int

Это потребует литье с возможной потерей точности.

То же самое верно для операторов с плавающей запятой

Если хотя бы один из операндов числовой оператор имеет тип double, тогда операция выполняется с использованием 64-разрядной арифметики с плавающей запятой, а результатом численного оператора является значение типа double. Если другой операнд не является двойным, он сначала расширяется (§5.1.5), чтобы набирать double путем числовой рекламы (§5.6).

blockquote>

Таким образом, продвижение выполняется по float в double.

И сочетание как целочисленного, так и плавающего значения приводит к плавающим значениям, указанным в

Если хотя бы один из операндов для двоичного оператора имеет тип с плавающей запятой, то операция является операцией с плавающей запятой, даже если другая является интегральной.

blockquote>

Это верно для двоичных операторов, но не для «операторов присваивания», таких как +=

Простой рабочий пример достаточно, чтобы доказать это

int i = 1;
i += 1.5f;

Причина в том, что здесь неявное выполнение сделано, это будет выполняться подобно

i = (int) i + 1.5f
i = (int) 2.5f
i = 2

20
задан Kiv 13 January 2009 в 22:36
поделиться

4 ответа

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

, csv.reader имеет вещи к очистке в случае исключения?

я пошел бы с:

with open("myfile.csv") as f:
    for row in csv.reader(f):
        # process row

Вы не должны отправлять патч для использования csv.reader и with оператор вместе.

import contextlib

Справка на функции contextmanager в модуле contextlib:

contextmanager(func)
    @contextmanager decorator.

Типичное использование:

    @contextmanager
    def some_generator(<arguments>):
        <setup>
        try:
            yield <value>
        finally:
            <cleanup>

Это делает это:

    with some_generator(<arguments>) as <variable>:
        <body>

эквивалентный этому:

    <setup>
    try:
        <variable> = <value>
        <body>
    finally:
        <cleanup>

Вот конкретный пример, как я использовал его: curses_screen.

19
ответ дан 30 November 2019 в 00:52
поделиться

Да. Второй путь корректен.

, относительно почему? Кто когда-либо знает. Вы правы, это - вероятно, легкое изменение. Это не как высокий приоритет как другие вещи.

можно легко сделать собственный набор патча и отправить его.

4
ответ дан 30 November 2019 в 00:52
поделиться

Проблемой является csv.reader, действительно не управляет контекстом. Это может принять любого повторяемого, не только файл. Поэтому это не звонит близко на его входе (случайно, если бы это сделало то Вы могли бы использовать contextlib.closing). Таким образом, не очевидно, что на самом деле сделала бы поддержка контекста csv.reader.

2
ответ дан 30 November 2019 в 00:52
поделиться

Легко создать то, что Вы хотите использовать функцию генератора:


import csv
from contextlib import contextmanager

@contextmanager
def opencsv(path):
   yield csv.reader(open(path))

with opencsv("myfile.csv") as reader:
   # do stuff with your csvreader
0
ответ дан 30 November 2019 в 00:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: