我正在尝试在 python 脚本中打开大型 .csv 文件(16k 行+,~15 列),但遇到了一些问题。
我使用内置的 open() 函数打开文件,然后使用输入文件声明一个 csv.DictReader 。循环的结构如下:
for (i, row) in enumerate(reader):
# do stuff (send serial packet, read response)
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用的文件长度超过 20 行,该文件将打开,但在几次迭代后我会收到 ValueError: I/O 操作已关闭的文件。
我的想法是,我可能会耗尽内存(尽管 16k 行文件只有 8MB,而且我有 3GB 内存),在这种情况下,我希望我需要使用某种缓冲区来仅加载一次将文件存入内存。
我走在正确的轨道上吗?或者是否还有其他原因导致文件意外关闭?
编辑:大约有一半的时间我使用 11 行的 csv 运行此命令,它会给出 ValueError。错误并不总是发生在同一行
我想在 \enumerate 环境中插入一个 \table ,我有这样的事情:
\begin{enumerate}
\item Item 1.
\item Item 2.
\item \begin{table}[htbp]
\textbf{\caption{Table1 Caption}}
\centering
\begin{tabular}{c c}
\hline\hline
Value 1 & Value 2\\
\hline
r1c1 & r2c2\\
r2c1 & r2c2\\
r3c1 & r3c2\\
\hline
\end{tabular}
\label{table1}
\end{table}
\item \begin{table}[htbp]
\textbf{\caption{Table 2 Caption}}
\centering
\begin{tabular}{ccc}
\hline\hline
Value 1 & Value 2 & Value 3\\
\hline
r1c1 & r1c2 & r1c3\\
r2c1 & r2c2 & r2c3\\
r3c1 & r3c2 & r3c3\\
\end{tabular}
\label{table2}
\end{table}
\item \ref{table1} and \ref{table2}
\end{enumerate}
Run Code Online (Sandbox Code Playgroud)
但是当我编译乳胶文档时,\enumerate …
我有一个枚举列表,有些项目有数字。我这样写:
\begin{enumerate}
\item Estado da arte:
\item Levantar os requisitos
\item Com o microcontrolador
\ref{figurametodo3}.
\begin{figure}[h!]
\begin{center}
\includegraphics[scale=0.6]{./dados/figuras/metodo_3}
\caption{Sistema para leitura da identificação de uma Tag}
\label{figurametodo3}
\end{center}
\end{figure}
\item Estudar
\begin{figure}[h]
\begin{center}
\includegraphics[scale=0.4]{./dados/figuras/metodo_4}
\caption{Comunicação entre o microcontrolador e o celular}
\label{figurametodo4}
\end{center}
\end{figure}
\item Desenvolver
\begin{figure}[h]
\begin{center}
\includegraphics[scale=0.6]{./dados/figuras/metodo_final}
\caption{Comunicação entre celulares e servidor}
\label{figura22}
\end{center}
\end{figure}
\end{enumerate}
Run Code Online (Sandbox Code Playgroud)
但它将列表下方的所有数字对齐,超出了我想要的位置。我希望我的数字保持在你的项目之下。名单内。
编辑:我想澄清一下,我在这里询问明确需要索引的情况。我知道for item in items在不需要的时候这样做会更好。我有一个长期的习惯,将列表项视为my_list[i]或arr[i]。我发现看到彼此相邻的列表名称和索引非常清晰且有帮助。所以我的问题实际上是,改变我对指数和价值的思考方式以适应工作方式是否有任何优势enumerate。
正如标题所说。我读过很多答案都说for i in range(len(arr))不好,但没有听到一个很好的理由来解释为什么会出现这种情况。一种说法是它“非 Pythonic”,但与 c 风格版本相比,它表面上看起来相当 Pythonic。
由于enumerate有一个有时不需要的额外参数,我对它的优点感到困惑,因为增加的简单性似乎并不能得到保证。我想更多地了解为什么我应该避免for i in range(len(arr)),或者这实际上是否只是取决于个人喜好。
下面的代码:
from typing import Union
def process(actions: Union[list[str], list[int]]) -> None:
for pos, action in enumerate(actions):
act(action)
def act(action: Union[str, int]) -> None:
print(action)
Run Code Online (Sandbox Code Playgroud)
生成 mypy 错误: Argument 1 to "act" has incompatible type "object"; expected "Union[str, int]"
但是,当删除枚举函数时,输入就可以了:
from typing import Union
def process(actions: Union[list[str], list[int]]) -> None:
for action in actions:
act(action)
def act(action: Union[str, int]) -> None:
print(action)
Run Code Online (Sandbox Code Playgroud)
有谁知道枚举函数正在做什么来影响类型?这是 python 3.9 和 mypy 0.921
我遇到了在选定元素上使用枚举器形成可迭代(即序列或迭代器或类似物)的情况,并希望返回原始索引而不是默认索引count,从 开始0一直到len(iterable) - 1.
一种非常幼稚的方法是声明一个名为的新生成器对象_enumerate()
>>> def _enumerate(iterable, offset = 0, step = 1):
index = offset
for element in iterable:
yield index, element
index += step
Run Code Online (Sandbox Code Playgroud)
...一个新的列表对象months。
>>> months = ["January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"]
Run Code Online (Sandbox Code Playgroud)
使用蟒蛇在积聚enumerate功能会产生这种输出的[5::2]切片:
>>> …Run Code Online (Sandbox Code Playgroud) 我有一个包含主密钥和列表列表的列表,其中每个封闭列表的第一个值(如'key_01')应该是相应值的子键(如'val_01', 'val_02').数据显示在这里:
master_keys = ["Master_01", "Master_02", "Master_03"]
data_long = [[['key_01','val_01','val_02'],['key_02','val_03','val_04'], ['key_03','val_05','val_06']],
[['key_04','val_07','val_08'], ['key_05','val_09','val_10'], ['key_06','val_11','val_12']],
[['key_07','val_13','val_14'], ['key_08','val_15','val_16'], ['key_09','val_17','val_18']]]
Run Code Online (Sandbox Code Playgroud)
我希望将这些列表组合成字典字典,如下所示:
master_dic = {
"Master_01": {'key_01':['val_01','val_02'],'key_02': ['val_03','val_04'], 'key_03': ['val_05','val_06']},
"Master_02": {'key_04': ['val_07','val_08'], 'key_05': ['val_09','val_10'], 'key_06': ['val_11','val_12']},
"Master_03": {'key_07': ['val_13','val_14'], ['key_08': ['val_15','val_16'], 'key_09': ['val_17','val_18']}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我得到的是子词:
import itertools
master_dic = {}
servant_dic = {}
keys = []
values = []
for line in data_long:
for item in line:
keys.extend(item[:1])
values.append(item[1:])
servant_dic = dict(itertools.izip(keys, values))
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它会输出一本字典.
servant_dic = {
'key_06': ['val_11','val_12'], …Run Code Online (Sandbox Code Playgroud) 所以我有一个 2D numpy 数组 (256,256),包含 0 到 10 之间的值,它本质上是一个图像。我需要删除 0 值并将它们设置为 NaN,以便我可以使用特定库 (APLpy) 绘制数组。但是,每当我尝试更改所有 0 值时,其他一些值都会被更改,在某些情况下会更改为原始值的 100 倍(不知道为什么)。
我正在使用的代码是:
for index, value in np.ndenumerate(tex_data):
if value == 0:
tex_data[index] = 'NaN'
Run Code Online (Sandbox Code Playgroud)
其中 tex_data 是我需要从中删除零的数据数组。不幸的是,我不能只对不需要的值使用掩码,因为据我所知,除了掩码数组之外,APLpy 不会。
无论如何我可以将 0 值设置为 NaN 而不更改数组中的其他值?
为什么这段非常简单的代码会在 Julia 1.1 中导致错误?
Threads.@threads for (index,value) in enumerate([0.1,0.2,0.3])
println(value^index)
end
Run Code Online (Sandbox Code Playgroud)
显示的错误是:
Error thrown in threaded loop on thread 0: MethodError(f=typeof(Base.unsafe_getindex)(), args=(Base.Iterators.Enumerate{Array{Float64, 1}}(itr=Array{Float64, (3,)}[0.1, 0.2, 0.3]), 1), world=0x00000000000069dc)
Error thrown in threaded loop on thread 1: MethodError(f=typeof(Base.unsafe_getindex)(), args=(Base.Iterators.Enumerate{Array{Float64, 1}}(itr=Array{Float64, (3,)}[0.1, 0.2, 0.3]), 3), world=0x00000000000069dc)
Run Code Online (Sandbox Code Playgroud)
我想在使用迭代器的Threads.@threads地方使用更复杂的代码enumerate。