

NetworkXを用いて、日本語ファイル(prn)を読み込もうとしたのですが、以下のエラーが出てしまいました。  
初歩的な点で申し訳ござませんが、ご助言頂けますと幸いです。

エラー  
QT---------------------------------------------------------------------------

[code]

    TypeError                                 Traceback (most recent call last)
    <ipython-input-28-f4f3d26af7f2> in <module>()
          2 G=nx.DiGraph()
          3 #エッジ（辺）リストをファイルを読み込んで作成
    ----> 4 G=nx.read_edgelist("sm10.prn",nodetype=int,create_using=nx.DiGraph())
          5 
          6 
    
    <C:\Users\IWAMOTO MOMOKA\Anaconda2\lib\site-packages\decorator.pyc:decorator-gen-703> in read_edgelist(path, comments, delimiter, create_using, nodetype, data, edgetype, encoding)
    
    C:\Users\IWAMOTO MOMOKA\Anaconda2\lib\site-packages\networkx\utils\decorators.pyc in _open_file(func_to_be_decorated, *args, **kwargs)
        238         # Finally, we call the original function, making sure to close the fobj
        239         try:
    --> 240             result = func_to_be_decorated(*new_args, **kwargs)
        241         finally:
        242             if close_fobj:
    
    C:\Users\IWAMOTO MOMOKA\Anaconda2\lib\site-packages\networkx\readwrite\edgelist.pyc in read_edgelist(path, comments, delimiter, create_using, nodetype, data, edgetype, encoding)
        367     return parse_edgelist(lines, comments=comments, delimiter=delimiter,
        368                           create_using=create_using, nodetype=nodetype,
    --> 369                           data=data)
        370 
        371 
    
    C:\Users\IWAMOTO MOMOKA\Anaconda2\lib\site-packages\networkx\readwrite\edgelist.pyc in parse_edgelist(lines, comments, delimiter, create_using, nodetype, data)
        267             except:
        268                 raise TypeError("Failed to convert nodes %s,%s to type %s."
    --> 269                                 % (u, v, nodetype))
        270 
        271         if len(d) == 0 or data is False:
    
    <type 'str'>: (<type 'exceptions.UnicodeEncodeError'>, UnicodeEncodeError('ascii', u"Failed to convert nodes \u9d8f,\u305f\u307e\u3054 to type <type 'int'>.", 24, 25, 'ordinal not in range(128)'))
    
[/code]

UNQT-------------------------------------------------------------

元ファイルおよびコードは以下の通りです。

QT-------------------------------------------------------------

[code]

    鶏      たまご
    ごはん  たまご
    オムライごはん
    チャーハオムライス
    にら玉  鶏
    
[/code]

UNQT-----------------------------------------------------------

QT--------------------------------------------------------------

[code]

    # coding=UTF-8
    #関数の宣言
    import networkx as nx
    import string
    import pandas as pd
    import collections
    import itertools
    import matplotlib.pyplot as plt
    import numpy as np
    
    #有向グラフを指定
    G=nx.DiGraph()
    #エッジ（辺）リストをファイルを読み込んで作成
    G=nx.read_edgelist("sm10.prn",nodetype=int,create_using=nx.DiGraph())
    
    
    #ノード(頂点)数出力
    print(nx.number_of_nodes(G))
    #エッジ数出力
    print(nx.number_of_edges(G))
    #ネットワーク基本情報出力
    print(nx.info(G))
    #次数分布
    
    print(nx.degree_histogram(G))
    
[/code]

UNQT-----------------------------------------------------------


CC BY-SA 4.0
2020-03-04T01:04:59.383
63544
2021-02-10T02:11:21.883
2021-02-10T02:11:21.883
3060
38030
question
python networkx
pythonのNetworkXで日本語が含まれるファイルを読み込みたい


**原因判明**  
取り敢えずエラーは無くして何かが表示されるところまでは来ました。

既に指摘した2点

  * データファイルの encoding を utf-8 に変換すること
  * nodetype=int を nodetype=str に変更すること

の他に、 **「データファイルの3行目・4行目の文字列が区切られていなくて有効なデータになっていない」**
というのが原因でした。質問記事を書いた際の転記ミスかもしれませんが、データを以下のように直したら処理が行われました。

[code]

    鶏         たまご
    ごはん     たまご
    オムライス ごはん
    チャーハン オムライス
    にら玉     鶏
    
[/code]

結果はこんな出力になっています。

[code]

    6
    5
    Name:
    Type: DiGraph
    Number of nodes: 6
    Number of edges: 5
    Average in degree:   0.8333
    Average out degree:   0.8333
    [0, 2, 4]
    
[/code]

環境的には Windows10 64bit, Python 3.7.6, NetworkX 2.4, pandas 1.0.1, matplotlib
3.2.0, numpy 1.18.1 を使っています。

* * *

**以下：当初回答**

単純に、データファイルが UTF-8 ではなく UTF-16 で作られているからでしょう。  
データファイルを UTF-8
に変換しておくか、`read_edgelist`呼び出し時に`encoding`を`utf-16`に指定すれば大丈夫だと思われます。

[read_edgelist](https://networkx.github.io/documentation/networkx-1.9.1/reference/generated/networkx.readwrite.edgelist.read_edgelist.html)

> read_edgelist(path, comments='#', delimiter=None, create_using=None,
> nodetype=None, data=True, edgetype=None, encoding='utf-8')

エラーメッセージのコードを見るとUTF-16のコードです。

>
[code]

>     <type 'str'>: (<type 'exceptions.UnicodeEncodeError'>,
> UnicodeEncodeError('ascii', u"Failed to convert nodes
> \u9d8f,\u305f\u307e\u3054 to type <type 'int'>.", 24, 25, 'ordinal not in
> range(128)'))
>  
[/code]

[\u9d8f](https://www.fileformat.info/info/unicode/char/9d8f/index.htm) 鶏  
[\u305f](https://www.fileformat.info/info/unicode/char/305f/index.htm) た  
[\u307e](https://www.fileformat.info/info/unicode/char/307e/index.htm) ま  
[\u3054](https://www.fileformat.info/info/unicode/char/3054/index.htm) ご

* * *

コメントに書かれたエラーの`0x0a`は改行コードなので、普通に文字の一部であり、それがエラーになるのはちょっとおかしい感じです。

それでデータフォーマット関連で検索してみたところでは、以下の記事を見ると `nodetype=int`ではなく `nodetype=str`
を指定してみてはどうでしょう。  
[Python の NetworkX 入門](https://qiita.com/tomov3/items/64f7315474747fc01a6c)  
データの例がこちらで

>
[code]

>     0 1
>     0 2
>     0 3
>     0 4
>      ：
>  
[/code]

プログラム例がこちら

>
[code]

>     # グラフを構築
>     G = nx.read_edgelist('facebook_combined.txt', nodetype=int)
>  
[/code]

[Pythonでネットワークを分析・可視化しよう！必要手順まとめ](https://www.sejuku.net/blog/91371)  
データの例がこちらで

> 実際のデータ: [edgelist.txt](https://s3-ap-northeast-1.amazonaws.com/samurai-blog-
> media/blog/wp-content/uploads/2019/04/edgelist.txt)
[code]

>     A B
>     A C
>     A D
>     A E
>     A F
>      ：
>  
[/code]

プログラム例がこちら

>
[code]

>     G = nx.read_edgelist('edgelist.txt', nodetype=str)
>  
[/code]


CC BY-SA 4.0
2020-03-04T01:47:24.423
63545
2020-03-07T11:03:30.213
2020-03-07T11:03:30.213
26370
26370
63544
answer