Python 如何从300GB文件中将一列提取到另一个文件

Python 如何从300GB文件中将一列提取到另一个文件,python,pandas,csv,bigdata,readline,Python,Pandas,Csv,Bigdata,Readline,问题是数据量太大了,我不得不用我的个人笔记本电脑和12GB内存来完成。我试了一个1米的环。每轮换行,并使用csv.writer。但是csv.writer写了100万。每两小时排队一次。那么,还有其他值得尝试的方法吗 lines = 10000000 for i in range(0, 330): list_str = [] with open(file, 'r') as f: line

问题是数据量太大了,我不得不用我的个人笔记本电脑和12GB内存来完成。我试了一个1米的环。每轮换行,并使用csv.writer。但是csv.writer写了100万。每两小时排队一次。那么,还有其他值得尝试的方法吗

        lines = 10000000
        for i in range(0, 330):
            list_str = []
            with open(file, 'r') as f:
                line_flag = 0
                for _ in range(i*lines):
                    next(f)
                for line in f:
                    line_flag = line_flag + 1
                    data = json.loads(line)['name']
                    if data != former_str:
                        list_str.append(data)
                        former_str = data
                    if line_flag == lines:
                        break
            with open(self.path + 'data_range\\names.csv', 'a', newline='') as writeFile:
                writer = csv.writer(writeFile, delimiter='\n')
                writer.writerow(list_str)
                writeFile.close()
另一个版本

def read_large_file(f):
    block_size = 200000000
    block = []
    for line in f:
        block.append(line[:-1])
        if len(block) == block_size:
            yield block
            block = []

    if block:
        yield block


def split_files():
    with open(write_file, 'r') as f:
        i = 0
        for block in read_large_file(f):
            print(i)
            file_name = write_name + str(i) + '.csv'
            with open(file_name, 'w', newline='') as f_:
                writer = csv.writer(f_, delimiter='\n')
                writer.writerow(block)
            i += 1

这是在它读了一段文字后。。。我想知道为什么数据传输率保持在0左右。

您喜欢这项工作吗

基本上是使用生成器来避免读取内存中的整个文件,并一次写入一行数据

import jsonlines  # pip install jsonlines
from typing import Generator

def gen_lines(file_path: str, col_name: str) -> Generator[str]:
    with jsonline.open(file_path) as f:
        for obj in f:
            yield obj[col_name]


# Here you can also change to writing a jsonline again
with open(output_file, "w") as out:
     for item in gen_lines(your_file_path, col_name_to_extract):
         out.write(f"{item}\n")


你喜欢这个工作吗

基本上是使用生成器来避免读取内存中的整个文件,并一次写入一行数据

import jsonlines  # pip install jsonlines
from typing import Generator

def gen_lines(file_path: str, col_name: str) -> Generator[str]:
    with jsonline.open(file_path) as f:
        for obj in f:
            yield obj[col_name]


# Here you can also change to writing a jsonline again
with open(output_file, "w") as out:
     for item in gen_lines(your_file_path, col_name_to_extract):
         out.write(f"{item}\n")


它应该是这么简单:

import json
import csv

with open(read_file, 'rt') as r, open(write_file, 'wt', newline='') as w:
    writer = csv.writer(w)
    for line in r:
        writer.writerow([json.loads(line)['name']])
我尝试在文件内循环,但我总是得到一个错误,我猜我们无法在打开文件时将数据写入另一个文件

您完全可以在读取另一个文件的同时在一个文件中写入数据。不过,我不能告诉你更多关于你的错误的信息,除非你把它说的话发出去


您的代码中有一点关于前_str的内容未在“摘录一列”中介绍,因此我没有写任何关于它的内容。

应该是这样简单的:

import json
import csv

with open(read_file, 'rt') as r, open(write_file, 'wt', newline='') as w:
    writer = csv.writer(w)
    for line in r:
        writer.writerow([json.loads(line)['name']])
我尝试在文件内循环,但我总是得到一个错误,我猜我们无法在打开文件时将数据写入另一个文件

您完全可以在读取另一个文件的同时在一个文件中写入数据。不过,我不能告诉你更多关于你的错误的信息,除非你把它说的话发出去



你的代码中有一点关于以前的代码,这在“摘录一列”中没有涉及,所以我没有写任何东西。

你能展示一下你尝试过的代码,它花了2个小时,排了一百万行吗?谢谢,是吗^^^我想让达斯克试试。良好的起点:由于反复重读已读的行,您的代码不必要地
O(N^2)
。打开文件一次,然后一次循环读取330行,然后处理该块。而且,我在任何地方都看不到
csv.readline
;您似乎有一个JSONL输入文件。@Amadan我尝试了文件内的循环,但我总是得到一个错误,我猜我们无法在打开文件时将数据写入另一个文件?您能展示一下您尝试过的代码,它花费了2个小时处理了100万行吗?谢谢,是吗^^^我想让dask试试。良好的起点:由于反复重读已读的行,您的代码不必要地
O(N^2)
。打开文件一次,然后一次循环读取330行,然后处理该块。而且,我在任何地方都看不到
csv.readline
;您似乎有一个JSONL输入文件。@Amadan我尝试了文件内的循环,但总是得到一个错误,我猜我们无法在打开文件时将数据写入另一个文件?前一个字符串是比较两个字符串是否相同。你的代码完全解决了我的问题!谢谢!!但我想知道,实际上我的代码读得很快,只是csv.writer很慢,你知道原因是什么吗?“读得很快,只是csv.writer很慢”-你怎么知道的?因为我在每个循环中都打印了我,并在csv前后打印了一些字符串。writethe
former_str
用于比较两个字符串是否相同。你的代码完全解决了我的问题!谢谢!!但我想知道,实际上我的代码读得很快,只是csv.writer很慢,你知道原因是什么吗?“读得很快,只是csv.writer很慢”-你怎么知道的?因为我在每个循环中都打印了我,在csv.writeI尝试类似的版本之前和之后都打印了一些字符串,但都是一样的,阅读没有问题,但当它打算写时,一小时内没有反应:/I我也添加了上面的代码。我尝试了类似的版本,但它是一样的,阅读没有问题,但当它打算写时,一小时内没有反应:/I我也添加了上面的代码