在本文中,我们将为您详细介绍只能通过csv阅读器迭代一次的相关知识,并且为您解答关于利用csv.reader函数读取的数据存储类型是的疑问,此外,我们还会提供一些关于bash–循环只在主体中使用`ss
在本文中,我们将为您详细介绍只能通过csv阅读器迭代一次的相关知识,并且为您解答关于利用csv.reader函数读取的数据存储类型是的疑问,此外,我们还会提供一些关于bash – 循环只在主体中使用`ssh`迭代一次、c# – 只能通过特定方法设置属性、CSV阅读器行为,无和空字符串、CSV阅读器(Python)中的“行包含NULL字节”的有用信息。
本文目录一览:- 只能通过csv阅读器迭代一次(利用csv.reader函数读取的数据存储类型是)
- bash – 循环只在主体中使用`ssh`迭代一次
- c# – 只能通过特定方法设置属性
- CSV阅读器行为,无和空字符串
- CSV阅读器(Python)中的“行包含NULL字节”
只能通过csv阅读器迭代一次(利用csv.reader函数读取的数据存储类型是)
因此,我基本上有一个非常长的字符串列表,以及一个包含一列字符串和一列数字的CSV文件。我需要遍历非常长的字符串列表,对于每个字符串,遍历CSV文件的行,检查CSV第一列中的每个字符串,以查看它是否出现在我的字符串中,如果确实存在,则添加在另一列中的数字。一个最小的例子是
import csvsList = [''a cat'', ''great wall'', ''mediocre wall'']vals = []with open(''file.csv'', ''r'') as f: r = csv.reader(f) for w in sList: val = 0 for row in r: if row[0] in w: val += 1 vals.append(val)
我可能会使用的CSV文件示例可能是
a, 1great, 2
当然csv.reader(f)创建一个可迭代的对象,我只能循环一次。我在其他地方看到过使用itertools的建议,但是我发现的所有建议都是针对涉及循环访问CSV文件几次(通常只有两次)的问题。如果我尝试使用它多次遍历CSV,我不确定这对内存消耗意味着什么,总的来说,我只是想知道解决此问题的最聪明方法。
答案1
小编典典您需要“重置”文件迭代器:
import csvsList = [''a cat'', ''great wall'', ''mediocre wall'']vals = []with open(''data.csv'', ''r'') as f: r = csv.reader(f) for w in sList: val = 0 f.seek(0) #<-- set the iterator to beginning of the input file for row in r: print(row) if row[0] in w: val += 1 vals.append(val)
bash – 循环只在主体中使用`ssh`迭代一次
我经常看到与……基本相同的问题
当我在循环体中调用ssh时,我的while循环只迭代一次.
while read -r line; do ssh somehost "command $line" done < argument_list.txt
解决方法
ssh somehost "command $line" < /dev/stdin
要么
ssh -n somehost "command $line"
如果ssh确实需要从标准输入读取,则不希望它从argument_list.txt中读取更多数据.在这种情况下,您需要为while循环使用不同的文件描述符.
while read -r line <&3; do ssh somehost "command $line" done 3< argument_list.txt
bash和其他一些shell也允许read使用-u选项来指定文件描述符,有些人可能会发现它更具可读性.
while read -r -u 3 line; do ssh somehost "command $line" done 3< argument_list.txt
c# – 只能通过特定方法设置属性
class Element { public elemEnum ElemType {get; set;} public double Amount {get; set;} // How many atoms of this type in the formula }
* elemEnum是所有化学元素的枚举.
我想让ElemType的集合解析一个字符串到枚举,但由于set只能接受与value相同类型的值,所以我决定添加一个方法:
public void SetElemType(string type) { this.ElemType = (elemEnum)Enum.Parse(typeof(elemEnum),type); }
是否有选项可以让SetElemType方法只能设置ElemType属性,而不必将其设为私有并添加GetElemType方法?
解决方法
使用private setter.
class Element { public ElemEnum ElemType {get; private set;} public double Amount {get; set;} public void SetElemType(string type) { this.ElemType = (ElemEnum)Enum.Parse(typeof(ElemEnum),type); } }
这样,ElemType只能在您自己的类中设置.
CSV阅读器行为,无和空字符串
我想None
在使用Python的csv
模块在Python数据结构和csv表示形式之间来回切换时区分和空字符串。
我的问题是,当我运行时:
import csv, cStringIOdata = [[''NULL/None value'',None], [''empty string'','''']]f = cStringIO.StringIO()csv.writer(f).writerows(data)f = cStringIO.StringIO(f.getvalue())data2 = [e for e in csv.reader(f)]print "input : ", dataprint "output: ", data2
我得到以下输出:
input : [[''NULL/None value'', None], [''empty string'', '''']]output: [[''NULL/None value'', ''''], [''empty string'', '''']]
当然,我可以使用data
和data2
区分None
和清空字符串,例如:
data = [d if d!=None else ''None'' for d in data]data2 = [d if d!=''None'' else None for d in data2]
但这会部分破坏我对csv
模块的兴趣(在C中实现快速反序列化/串行化,尤其是在处理大型列表时)。
是否有一个csv.Dialect
或参数csv.writer
,并csv.reader
能够使他们之间的区别''''
,并None
在此用例?
如果不是,是否有兴趣实施补丁csv.writer
以实现这种来回交互?(可能是Dialect.None_translate_to
默认设置的参数,''''
以确保向后兼容)
答案1
小编典典该文档建议您无法实现:
为了尽可能容易地与实现DB API的模块接口,将值None写入空字符串。
这在writer
该类的文档中,表明所有方言都适用,这是csv模块的固有限制。
我会支持更改此代码(以及csv模块的其他各种限制),但可能是人们希望将此类工作分流到另一个库中,并使CSV模块保持简单(或至少如此简单)照原样)。
如果您需要更强大的文件读取功能,则可能需要查看numpy,scipy和pandas中的CSV读取功能,我记得其中有更多选择。
CSV阅读器(Python)中的“行包含NULL字节”
我正在尝试编写一个程序,该程序查看.CSV文件(input.csv)并仅重写以某个元素(corrected.csv)开头的行,如文本文件(output.txt)中所列。
这是我的程序现在的样子:
import csvlines = []with open(''output.txt'',''r'') as f: for line in f.readlines(): lines.append(line[:-1])with open(''corrected.csv'',''w'') as correct: writer = csv.writer(correct, dialect = ''excel'') with open(''input.csv'', ''r'') as mycsv: reader = csv.reader(mycsv) for row in reader: if row[0] not in lines: writer.writerow(row)
不幸的是,我一直收到此错误,而且我不知道它是什么。
Traceback (most recent call last): File "C:\Python32\Sample Program\csvParser.py", line 12, in <module> for row in reader:_csv.Error: line contains NULL byte
感谢这里的所有人,甚至使我明白这一点。
在csv.reader
无法打开文件时,它需要一个文件对象。更好的解决方案是:
import csvlines = []with open(''output.txt'', ''r'') as f: for line in f.readlines(): lines.append(line[:-1])with open(''corrected.csv'',''w'') as correct: writer = csv.writer(correct, dialect = ''excel'') with open(''input.csv'', ''r'') as mycsv: reader = csv.reader(mycsv) for row in reader: if row[0] not in lines: writer.writerow(row)
答案1
小编典典我已经通过更简单的解决方案解决了类似的问题:
import codecscsvReader = csv.reader(codecs.open(''file.csv'', ''rU'', ''utf-16''))
关键是使用编解码器模块以UTF-16编码打开文件,还有很多编码,请查看文档。
今天关于只能通过csv阅读器迭代一次和利用csv.reader函数读取的数据存储类型是的分享就到这里,希望大家有所收获,若想了解更多关于bash – 循环只在主体中使用`ssh`迭代一次、c# – 只能通过特定方法设置属性、CSV阅读器行为,无和空字符串、CSV阅读器(Python)中的“行包含NULL字节”等相关知识,可以在本站进行查询。
本文标签: