Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何就地解析位置?_Python_Python 2.7 - Fatal编程技术网

Python:如何就地解析位置?

Python:如何就地解析位置?,python,python-2.7,Python,Python 2.7,没有任何包含多个列的标题,例如: john, 1, orange, chicken mary, 7, purple, hamburger joey, 2, yellow, chicken 您可以使用标准库中的csv: import csv with open('old.csv') as old_file, open('new.csv', 'w') as new_file: cr = csv.reader(old_file) cw = csv.writer(new_file)

没有任何包含多个列的标题,例如:

john, 1, orange, chicken
mary, 7, purple, hamburger
joey, 2, yellow, chicken

您可以使用标准库中的
csv

import csv

with open('old.csv') as old_file, open('new.csv', 'w') as new_file:
    cr = csv.reader(old_file)
    cw = csv.writer(new_file)
    cw.writerows([r for r in cr if r[3] == 'chicken'])

首先,我使用上下文管理器来正确关闭文件。然后有两个对象用于读取和写入csv。最后一行在第四列中用chicken重写行,而不将整个文件加载到内存。

您不需要
csv
,只需要简单的python即可。这个解决方案在内存方面非常有效,因为它只是逐行操作

with open('temp.csv', 'r') as fin, open('temp2.csv', 'w') as fout:
    for row in fin:
        if row.split()[3] == 'chicken':
            fout.write(row)
这比列表理解的内存效率要高得多,列表理解需要读取并将写入文件的所有数据存储在内存中

计时

# Create sample data file of 30k rows, 2/3rds with 'chicken'.
with open('temp.csv', 'w') as f:
    for _ in range(10000):
        f.write("john,1,orange,chicken\n")
        f.write("mary,7,purple,hamburger\n")
        f.write("joey,2,yellow,chicken\n")

%%timeit
with open('temp.csv', 'r') as fin, open('temp2.csv', 'w') as fout:
    for row in fin:
        if row.split()[3] == 'chicken':
            fout.write(row)
# 10 loops, best of 3: 41 ms per loop

%%timeit
with open('temp.csv') as old_file, open('temp3.csv', 'w') as new_file:
    cr = csv.reader(old_file)
    cw = csv.writer(new_file)
    cw.writerows([r for r in cr if r[3] == 'chicken'])
# 10 loops, best of 3: 58.7 ms per loop

# Turn previous list comprehension into a generator.
%%timeit
with open('temp.csv') as old_file, open('temp3.csv', 'w') as new_file:
    cr = csv.reader(old_file)
    cw = csv.writer(new_file)
    cw.writerows((r for r in cr if r[3] == 'chicken'))
# 10 loops, best of 3: 66.5 ms per loop

with open('temp.csv') as input_file, open('temp4.csv', 'w', newline='') as output_file:
    reader = csv.reader(input_file, delimiter=',')
    writer = csv.writer(output_file, delimiter=',')
    writer.writerows(filter(lambda x: x[3].strip() != 'chcicken', reader))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-41-072d37a3ff92> in <module>()
----> 1 with open('temp.csv') as input_file, open('temp4.csv', 'w', newline='') as output_file:
      2     reader = csv.reader(input_file, delimiter=',')
      3     writer = csv.writer(output_file, delimiter=',')
      4     writer.writerows(filter(lambda x: x[3].strip() != 'chcicken', reader))

TypeError: 'newline' is an invalid keyword argument for this function
#创建30k行的样本数据文件,2/3rds带“chicken”。
打开('temp.csv','w')作为f:
对于范围内的(10000):
f、 写下(“约翰,1,橘子,鸡”\n”)
f、 写(“玛丽,7岁,紫色,汉堡包”)
f、 写下(“乔伊,2,黄,鸡”\n”)
%%时间
以open('temp.csv','r')作为fin,open('temp2.csv','w')作为fout:
对于fin中的行:
如果row.split()
fout.写入(第行)
#10个回路,最好为3:41 ms/回路
%%时间
打开('temp.csv')作为旧的\u文件,打开('temp3.csv','w')作为新的\u文件:
cr=csv.reader(旧文件)
cw=csv.writer(新文件)
cw.writerows([r代表cr中的r,如果r[3]=='chicken']))
#10个回路,最佳3个:每个回路58.7毫秒
#将以前的列表理解转换为生成器。
%%时间
打开('temp.csv')作为旧的\u文件,打开('temp3.csv','w')作为新的\u文件:
cr=csv.reader(旧文件)
cw=csv.writer(新文件)
cw.writerows((如果r[3]=“chicken”),则r代表cr中的r)
#10个回路,最佳3个:每个回路66.5毫秒
将open('temp.csv')作为输入_文件,将open('temp4.csv','w',newline='')作为输出_文件:
reader=csv.reader(输入文件,分隔符=',')
writer=csv.writer(输出文件,分隔符=',')
writer.writerows(过滤器(lambda x:x[3].strip()!='chcicken',读卡器))
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1以open('temp.csv')作为输入_文件,以open('temp4.csv','w',换行符='')作为输出_文件:
2 reader=csv.reader(输入_文件,分隔符=',')
3 writer=csv.writer(输出文件,分隔符=',')
4 writer.writerows(过滤器(lambda x:x[3].strip()!='chcicken',读卡器))
TypeError:“newline”是此函数的无效关键字参数
虽然您可以使用来实例化您自己的阅读器,但将每一行处理为一个元组,然后在元组上迭代以选择给定列与您的条件匹配的所有项

。。。您还可以通过使用构建在其上的库来更简洁地实现这一点,而库又是生态系统的一部分

对于这样一个简单的操作,似乎需要安装和导入大量代码。但这就引出了一个问题:你只是想做一些非常具体和小规模的事情吗?或者您正在编写一些可能需要扩展到更大的数据集并最终支持更复杂的分析或查询的内容

学习熊猫和NumPy是非常值得的投资。安装它相当简单,然后在处理数组、系列或“框架”(如表格、标签和索引等电子表格)中的数据时可以随时使用它

以下是你如何处理熊猫的方法:

import pandas as pd
data_file = './mydata.csv'  ## <-- Change this to match yours
data = pd.read_csv(data_file)
rows = data[data.loc[:,3]=='chicken']
## Use rows here
。。。这将匹配第3列(包含字符串“chicken”)所在的任何数据行。但这种映射很难理解,而且可能效率较低

这些例子可能看起来有点难读,尤其是如果你正在阅读其他使用熊猫的例子。这是因为人们通常处理的是有标签的数据帧。通过简单地分配一个名称列表,您可以轻松地将自己的标签添加到内存中的数据中,如下所示:

import pandas as pd
data_file = './mydata.csv'  ## <-- Change this to match yours
data = pd.read_csv(data_file)

# Add this:
data.columns=['name', 'num', 'color', 'food']
# Select with this:
rows = data[data['food']=='chicken']
将熊猫作为pd导入

data_file='./mydata.csv'###在Python中解析csv可能有数千个问题。有一个标准的库模块,方便地称为
csv
,其中包含一些。你试过使用那个模块吗?你试过什么?标准问题:你有没有比我的答案更快更好的答案。。很好的理解。你应该更好地处理I/O。。。不要以牺牲良好编程实践为代价编写高尔夫代码。@cᴏʟᴅsᴘᴇᴇᴅ 你的意思是将
一起使用?你真的应该使用
csv
模块,你可以使用生成器表达式而不是列表理解来对其进行惰性计算,尽管我个人还是更喜欢for循环。@juanpa.arrivillaga为什么要使用csv?因为,这就是它的用途,解析和写入csv。为什么要使用Python?无论如何,你们可以在汇编程序中编写这个程序,我打赌它会更快,内存效率更高。其中一个最重要的教训是“当一个经过战斗测试的标准库模块已经存在时,不要重新发明轮子,不要推出你自己的版本”对于这样一个简单的案例来说,这是一个过火的教训。除非csv文件是在Excel中创建的。。。这样,使用
csv
解析就更容易了。
...
data[data.loc[:,3].map(lambda x: 'chicken' in x)]
import pandas as pd
data_file = './mydata.csv'  ## <-- Change this to match yours
data = pd.read_csv(data_file)

# Add this:
data.columns=['name', 'num', 'color', 'food']
# Select with this:
rows = data[data['food']=='chicken']
import csv
import sqlite3

database = ':memory:'  ## <-- replace this is a filename to make the data persisten!
conn = sql.connect(':memory:')
db = conn.cursor()
results = db.execute('CREATE TABLE IF NOT EXISTS data (name VARCHAR, num INTEGER, color VARCHAR, food VARCHAR)')
## Could use data.to_sql('data', conn) if you've already created
## the data DataFrame as in the previous example

stmt_ins = 'INSERT INTO data (name, num, color, food) VALUES (?, ?, ?, ?)'
## Could use less robust: stmt_ins = "INSERT INTO data VALUES (?, ?, ?, ?)"

with open(data_file) as f:
    reader = csv.reader(f)
    for row in reader:
        if len(row) != 4:
            # Skip errors
            continue
        try:
            row[1] == int(row[1])
        except ValueError, err:
            # Skip errors
            continue
        results = None
        try:
            results = db.execute(stmt_ins, row)
        except sqlite3.Error:
            # Skip errors
            continue
        if results.rowcount != 1:
            # Ignore the error
            pass

rows = db.execute("SELECT * FROM data WHERE food = 'chicken'").fetchall()
# db.close(); conn.close()