Python 如何解析第四列为json的制表符分隔文本文件并删除某些键?

Python 如何解析第四列为json的制表符分隔文本文件并删除某些键?,python,json,csv,parsing,text,Python,Json,Csv,Parsing,Text,我有一个26 Gb的文本文件,行格式如下 /type/edition/books/ol1000035m 4 2010-04-24T17:54:01.503315{“出版商”:[“伯南出版社],“物理格式”:“精装本”,“副标题”:“1992年11月9日至12月3日”,“关键字”:“/books/ol1000035m”,“标题”:“议会辩论,上议院,合订本,1992-93年”,“标识符”:{“古德读物”:[“6850240”},“isbn 13”:[“9780107805401”],“语言”:[{

我有一个26 Gb的文本文件,行格式如下

/type/edition/books/ol1000035m 4 2010-04-24T17:54:01.503315{“出版商”:[“伯南出版社],“物理格式”:“精装本”,“副标题”:“1992年11月9日至12月3日”,“关键字”:“/books/ol1000035m”,“标题”:“议会辩论,上议院,合订本,1992-93年”,“标识符”:{“古德读物”:[“6850240”},“isbn 13”:[“9780107805401”],“语言”:[{“键”:“/语言/engineg”}],“页数”:64,“isbn\u10”:[“0107805405”],“发布日期”:“1993年12月”,“上次修改”:“{“类型”:“/类型/日期时间”,“值”:“2010-04-24T17:54:01.503315”,“作者”:[{“键”:“/作者/OL264577A”}],“最新修订版”:4,“作品”[{“键”:/works“:”/type/edition“},“主题”:[“政府-比较”,“政治/时事],“修订版”:4}

我只想得到最后几列,这是一个json,从这个json我只想保存“标题”,“isbn 13”,“isbn 10”

我只能用这段代码保存最后一列

csv.field_size_limit(sys.maxsize)
# File names: to read in from and read out to
input_file = '../inputFile/ol_dump_editions_2019-10-31.txt'
output_file = '../outputFile/output.txt'

## ==================== ##
##  Using module 'csv'  ##
## ==================== ##
with open(input_file) as to_read:
    with open(output_file, "w") as tmp_file:
        reader = csv.reader(to_read, delimiter = "\t")
        writer = csv.writer(tmp_file)

        desired_column = [4]        # text column

        for row in reader:     # read one row at a time
            myColumn = list(row[i] for i in desired_column)   # build the output row (process)
            writer.writerow(myColumn) # write it
但这并没有返回一个正确的json对象,而是返回所有在其旁边带有双引号的内容。另外,如何从json中提取某些值作为新的json

编辑:

“{”“出版商”“:[”“伯南出版社”“],”“实体形式”“:”“精装书”“副标题”“:”“1992年11月9日至12月3日”“关键”“:”“/books/ol1000035m”“标题”“:”“议会辩论,上议院,装订卷,1992-93”“标识符”“:{”“古读”“:[”“6850240”“]}”“isbn 13”“:[”“9780107805401”“,”“语言”“:[{”“key:”“/languages/english”“}],“页数”“:64”,“isbn十”“:[”“0107805405”“],“发布日期”“:”“1993年12月”“,”“上次修改”“:{”“type”“:”“/type/datetime”“,”“value”“:”“2010-04-24T17:54:01.503315”“,”“作者”“:[{”“key”“:”“/authors/ol264577a”“,”“最新修订版”“:4”“,”“works”“:[”“key”“:”“:”“/works/ol79250w”“,”“type”“,”“”{“key”:“/type/edition”}”、“subjects”:[“政府-比较”、“政治/时事”],“revision”:4}“

编辑2:

因此,我正在尝试读取此文件,它是一个选项卡分隔的文件,包含以下列:

类型-记录类型(/type/edition、/type/work等) 键-记录的唯一键。(/books/OL1M等) 修订-记录的修订号 last_modified-上次修改的时间戳 JSON—JSON格式的完整记录

我试图读取JSON文件,从该JSON文件中,我只想获取“标题”、“isbn 13”、“isbn 10”作为JSON,并将其作为一行保存到文件中


因此,每一行都应该看起来像原始行,但只有那些键和值,特别是因为您的示例太大,我建议使用一个专门的库,例如,它有一个
read\u csv
方法,甚至支持内存不足操作

这两个系统都会自动为您解析报价,dask将直接从磁盘“分块”解析报价,这样您就不必尝试将26GB加载到RAM中

在这两个库中,您可以访问所需的列,如下所示:

{'authors': [{'key': '/authors/OL2645777A'}],
 'identifiers': {'goodreads': ['6850240']},
 'isbn_10': ['0107805405'],
 'isbn_13': ['9780107805401'],
 'key': '/books/OL10000135M',
 'languages': [{'key': '/languages/eng'}],
 'last_modified': {'type': '/type/datetime',
  'value': '2010-04-24T17:54:01.503315'},
 'latest_revision': 4,
 'number_of_pages': 64,
 'physical_format': 'Hardcover',
 'publish_date': 'December 1993',
 'publishers': ['Bernan Press'],
 'revision': 4,
 'subjects': ['Government - Comparative', 'Politics / Current Events'],
 'subtitle': '9th November - 3rd December, 1992',
 'title': 'Parliamentary Debates, House of Lords, Bound Volumes, 1992-93',
 'type': {'key': '/type/edition'},
 'works': [{'key': '/works/OL7925046W'}]}
data=read\u csv(路径)
数据[“ColumnName”]
然后,您可以使用
json.loads()
import json
)或者使用pandas/dask json实现来解析这些行。如果您能提供一些您期望的详细信息,我可以帮助您起草一个更具体的代码示例


祝你好运!

特别是因为你的示例太大了,我建议使用一个专门的库,例如,它有一个
读取csv
方法,甚至支持内存不足操作

这两个系统都会自动为您解析报价,dask将直接从磁盘“分块”解析报价,这样您就不必尝试将26GB加载到RAM中

在这两个库中,您可以访问所需的列,如下所示:

{'authors': [{'key': '/authors/OL2645777A'}],
 'identifiers': {'goodreads': ['6850240']},
 'isbn_10': ['0107805405'],
 'isbn_13': ['9780107805401'],
 'key': '/books/OL10000135M',
 'languages': [{'key': '/languages/eng'}],
 'last_modified': {'type': '/type/datetime',
  'value': '2010-04-24T17:54:01.503315'},
 'latest_revision': 4,
 'number_of_pages': 64,
 'physical_format': 'Hardcover',
 'publish_date': 'December 1993',
 'publishers': ['Bernan Press'],
 'revision': 4,
 'subjects': ['Government - Comparative', 'Politics / Current Events'],
 'subtitle': '9th November - 3rd December, 1992',
 'title': 'Parliamentary Debates, House of Lords, Bound Volumes, 1992-93',
 'type': {'key': '/type/edition'},
 'works': [{'key': '/works/OL7925046W'}]}
data=read\u csv(路径)
数据[“ColumnName”]
然后,您可以使用
json.loads()
import json
)或者使用pandas/dask json实现来解析这些行。如果您能提供一些您期望的详细信息,我可以帮助您起草一个更具体的代码示例


祝你好运!

鉴于当前代码返回以下内容:

result = '{""publishers"": [""Bernan Press""], ""physical_format"": ""Hardcover"", ""subtitle"": ""9th November - 3rd December, 1992"", ""key"": ""/books/OL10000135M"", ""title"": ""Parliamentary Debates, House of Lords, Bound Volumes, 1992-93"", ""identifiers"": {""goodreads"": [""6850240""]}, ""isbn_13"": [""9780107805401""], ""languages"": [{""key"": ""/languages/eng""}], ""number_of_pages"": 64, ""isbn_10"": [""0107805405""], ""publish_date"": ""December 1993"", ""last_modified"": {""type"": ""/type/datetime"", ""value"": ""2010-04-24T17:54:01.503315""}, ""authors"": [{""key"": ""/authors/OL2645777A""}], ""latest_revision"": 4, ""works"": [{""key"": ""/works/OL7925046W""}], ""type"": {""key"": ""/type/edition""}, ""subjects"": [""Government - Comparative"", ""Politics / Current Events""], ""revision"": 4}'
看起来您需要做的是:首先-将那些双引号替换为常规双引号,否则事情就不可分析了:

res = result.replace('""','"')
现在,
res
可转换为JSON对象:

import json
my_json = json.loads(res)
my_json
现在看起来像这样:

{'authors': [{'key': '/authors/OL2645777A'}],
 'identifiers': {'goodreads': ['6850240']},
 'isbn_10': ['0107805405'],
 'isbn_13': ['9780107805401'],
 'key': '/books/OL10000135M',
 'languages': [{'key': '/languages/eng'}],
 'last_modified': {'type': '/type/datetime',
  'value': '2010-04-24T17:54:01.503315'},
 'latest_revision': 4,
 'number_of_pages': 64,
 'physical_format': 'Hardcover',
 'publish_date': 'December 1993',
 'publishers': ['Bernan Press'],
 'revision': 4,
 'subjects': ['Government - Comparative', 'Politics / Current Events'],
 'subtitle': '9th November - 3rd December, 1992',
 'title': 'Parliamentary Debates, House of Lords, Bound Volumes, 1992-93',
 'type': {'key': '/type/edition'},
 'works': [{'key': '/works/OL7925046W'}]}
您可以方便地从该对象获取所需的任何字段:

my_json['title']
# 'Parliamentary Debates, House of Lords, Bound Volumes, 1992-93'
my_json['isbn_10'][0]
# '0107805405'

因此,假设当前代码返回以下内容:

result = '{""publishers"": [""Bernan Press""], ""physical_format"": ""Hardcover"", ""subtitle"": ""9th November - 3rd December, 1992"", ""key"": ""/books/OL10000135M"", ""title"": ""Parliamentary Debates, House of Lords, Bound Volumes, 1992-93"", ""identifiers"": {""goodreads"": [""6850240""]}, ""isbn_13"": [""9780107805401""], ""languages"": [{""key"": ""/languages/eng""}], ""number_of_pages"": 64, ""isbn_10"": [""0107805405""], ""publish_date"": ""December 1993"", ""last_modified"": {""type"": ""/type/datetime"", ""value"": ""2010-04-24T17:54:01.503315""}, ""authors"": [{""key"": ""/authors/OL2645777A""}], ""latest_revision"": 4, ""works"": [{""key"": ""/works/OL7925046W""}], ""type"": {""key"": ""/type/edition""}, ""subjects"": [""Government - Comparative"", ""Politics / Current Events""], ""revision"": 4}'
看起来您需要做的是:首先-将那些双引号替换为常规双引号,否则事情就不可分析了:

res = result.replace('""','"')
现在,
res
可转换为JSON对象:

import json
my_json = json.loads(res)
my_json
现在看起来像这样:

{'authors': [{'key': '/authors/OL2645777A'}],
 'identifiers': {'goodreads': ['6850240']},
 'isbn_10': ['0107805405'],
 'isbn_13': ['9780107805401'],
 'key': '/books/OL10000135M',
 'languages': [{'key': '/languages/eng'}],
 'last_modified': {'type': '/type/datetime',
  'value': '2010-04-24T17:54:01.503315'},
 'latest_revision': 4,
 'number_of_pages': 64,
 'physical_format': 'Hardcover',
 'publish_date': 'December 1993',
 'publishers': ['Bernan Press'],
 'revision': 4,
 'subjects': ['Government - Comparative', 'Politics / Current Events'],
 'subtitle': '9th November - 3rd December, 1992',
 'title': 'Parliamentary Debates, House of Lords, Bound Volumes, 1992-93',
 'type': {'key': '/type/edition'},
 'works': [{'key': '/works/OL7925046W'}]}
您可以方便地从该对象获取所需的任何字段:

my_json['title']
# 'Parliamentary Debates, House of Lords, Bound Volumes, 1992-93'
my_json['isbn_10'][0]
# '0107805405'

这里有一个简单的方法,您需要重复这个步骤,并在读取文件时逐行从文件的每一行提取所需的数据(Python中处理文本文件读取的默认方式)

采样线的输出:

{
“标题”:“议会辩论,上议院,合订卷,1992-1993年”,
“isbn_13”:[
"9780107805401"
],
“isbn_10”:[
"0107805405"
]
}

这是一种简单的方法。您需要重复此操作,并在读取文件时逐行从文件的每一行提取所需数据(Python中处理文本文件读取的默认方式)

采样线的输出:

{
“标题”:“议会辩论,上议院,合订卷,1992-1993年”,
“isbn_13”:[
"9780107805401"
],
"