回答編集履歴

5

追記

2019/01/14 13:34

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -34,7 +34,7 @@
34
34
 
35
35
 
36
36
 
37
- 実験
37
+ 実験1
38
38
 
39
39
  ---
40
40
 
@@ -58,7 +58,7 @@
58
58
 
59
59
 
60
60
 
61
- #
61
+ # OS標準の改行文字を指定した場合
62
62
 
63
63
  out1 = io.StringIO(newline=os.linesep)
64
64
 
@@ -78,7 +78,7 @@
78
78
 
79
79
 
80
80
 
81
- #
81
+ # 空文字列を指定した場合
82
82
 
83
83
  out2 = io.StringIO(newline='')
84
84
 
@@ -126,7 +126,7 @@
126
126
 
127
127
 
128
128
 
129
- **実結果2** [Wandbox](https://wandbox.org/permlink/rejf8PsFeTJfgVIr) ([Linux](https://wandbox.org/permlink/9O0YFquTxKmn1j0N))
129
+ **実結果2** [Wandbox](https://wandbox.org/permlink/rejf8PsFeTJfgVIr) ([Linux](https://wandbox.org/permlink/9O0YFquTxKmn1j0N))
130
130
 
131
131
  ```
132
132
 
@@ -142,6 +142,44 @@
142
142
 
143
143
 
144
144
 
145
+ 実験2
146
+
147
+ ---
148
+
149
+ ```Python
150
+
151
+ import csv
152
+
153
+
154
+
155
+ src = '\x0d' * 10
156
+
157
+ data = list(csv.reader(src))
158
+
159
+
160
+
161
+ print(data)
162
+
163
+ ```
164
+
165
+
166
+
167
+ **実行結果** (Windows)
168
+
169
+ ```
170
+
171
+ C:...>python tera.py
172
+
173
+ [[], [], [], [], [], [], [], [], [], []]
174
+
175
+ ```
176
+
177
+
178
+
179
+ 復帰文字が癌になっていることが分かります。
180
+
181
+
182
+
145
183
  コードの書き方について
146
184
 
147
185
  ---

4

追記

2019/01/14 13:33

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -34,6 +34,114 @@
34
34
 
35
35
 
36
36
 
37
+ 実験
38
+
39
+ ---
40
+
41
+ ```Python
42
+
43
+ import csv
44
+
45
+ import io
46
+
47
+ import os
48
+
49
+
50
+
51
+
52
+
53
+ data = [
54
+
55
+ [1, 2], [3, 4]
56
+
57
+ ]
58
+
59
+
60
+
61
+ #
62
+
63
+ out1 = io.StringIO(newline=os.linesep)
64
+
65
+ csv.writer(out1).writerows(data)
66
+
67
+
68
+
69
+ print(
70
+
71
+ ' '.join(
72
+
73
+ ch.encode().hex() for ch in out1.getvalue()
74
+
75
+ )
76
+
77
+ )
78
+
79
+
80
+
81
+ #
82
+
83
+ out2 = io.StringIO(newline='')
84
+
85
+ csv.writer(out2).writerows(data)
86
+
87
+
88
+
89
+ print(
90
+
91
+ ' '.join(
92
+
93
+ ch.encode().hex() for ch in out2.getvalue()
94
+
95
+ )
96
+
97
+ )
98
+
99
+ ```
100
+
101
+
102
+
103
+ **実行結果1** (手元のWindows)
104
+
105
+ ```cmd
106
+
107
+ C:...>ver
108
+
109
+ Microsoft Windows [Version 10.0.17134.523]
110
+
111
+
112
+
113
+ C:...>python --version
114
+
115
+ Python 3.6.7 :: Anaconda, Inc.
116
+
117
+
118
+
119
+ C:...>python tera.py
120
+
121
+ 31 2c 32 0d 0d 0a 33 2c 34 0d 0d 0a
122
+
123
+ 31 2c 32 0d 0a 33 2c 34 0d 0a
124
+
125
+ ```
126
+
127
+
128
+
129
+ **実験結果2** [Wandbox](https://wandbox.org/permlink/rejf8PsFeTJfgVIr) ([Linux](https://wandbox.org/permlink/9O0YFquTxKmn1j0N))
130
+
131
+ ```
132
+
133
+ 31 2c 32 0d 0a 33 2c 34 0d 0a
134
+
135
+ 31 2c 32 0d 0a 33 2c 34 0d 0a
136
+
137
+ ```
138
+
139
+
140
+
141
+ 0dが復帰文字、0aが改行文字です。
142
+
143
+
144
+
37
145
  コードの書き方について
38
146
 
39
147
  ---

3

追記

2019/01/14 13:25

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -14,13 +14,19 @@
14
14
 
15
15
  > ####csv.reader(csvfile, dialect='excel', **fmtparams)
16
16
 
17
- 与えられた csvfile 内の行を反復処理するような reader オブジェクトを返します。 csvfile はイテレータ(iterator)プロトコルをサポートし、 __next__() メソッドが呼ばれた際に常に文字列を返すような任意のオブジェクトにすることができます — ファイルオブジェクト でもリストでも構いません。**csvfile がファイルオブジェクトの場合、 newline='' として開くべきです**。
17
+ 与えられた csvfile 内の行を反復処理するような reader オブジェクトを返します。 csvfile はイテレータ(iterator)プロトコルをサポートし、 __next__() メソッドが呼ばれた際に常に文字列を返すような任意のオブジェクトにすることができます — ファイルオブジェクト でもリストでも構いません。**csvfile がファイルオブジェクトの場合、 newline='' として開くべきです**[1]
18
18
 
19
19
 
20
20
 
21
21
  > ####csv.writer(csvfile, dialect='excel', **fmtparams)
22
22
 
23
- ユーザが与えたデータをデリミタで区切られた文字列に変換し、与えられたファイルオブジェクトに書き込むための writer オブジェクトを返します。 csvfile は write() メソッドを持つ任意のオブジェクトです。 **csvfile がファイルオブジェクトの場合、 newline='' として開くべきです** 。
23
+ ユーザが与えたデータをデリミタで区切られた文字列に変換し、与えられたファイルオブジェクトに書き込むための writer オブジェクトを返します。 csvfile は write() メソッドを持つ任意のオブジェクトです。 **csvfile がファイルオブジェクトの場合、 newline='' として開くべきです** [1]
24
+
25
+
26
+
27
+ > ####脚注
28
+
29
+ [1] newline='' が指定されない場合、クォートされたフィールド内の改行は適切に解釈されず、書き込み時に \r\n を行末に用いる処理系では余分な \r が追加されてしまいます。csv モジュールは独自 (universal newlines) の改行処理を行うため、newline='' を指定することは常に安全なはずです。
24
30
 
25
31
 
26
32
 

2

追記

2019/01/14 13:09

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -25,3 +25,17 @@
25
25
 
26
26
 
27
27
  引用元: [Python 標準ライブラリ » csv — CSV ファイルの読み書き](https://docs.python.jp/3/library/csv.html#module-contents)
28
+
29
+
30
+
31
+ コードの書き方について
32
+
33
+ ---
34
+
35
+ teratailには、コードを見やすく表示する機能があります。
36
+
37
+ 質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
38
+
39
+ ![Python](56957fe805d9d7befa7dba6a98676d2b.gif)
40
+
41
+ 特にPythonの場合、インデントが崩れるとコードの意味が変わってしまいます。

1

追記

2019/01/14 13:08

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -1,4 +1,4 @@
1
- CSVファイルを出力する際は、newlineオプションを変えてやる必要があります。
1
+ CSVファイルを出力する際は、newlineオプションを指定する必要があります。
2
2
 
3
3
  ```Python
4
4
 
@@ -9,3 +9,19 @@
9
9
  csvout.writerows(villains)
10
10
 
11
11
  ```
12
+
13
+
14
+
15
+ > ####csv.reader(csvfile, dialect='excel', **fmtparams)
16
+
17
+ 与えられた csvfile 内の行を反復処理するような reader オブジェクトを返します。 csvfile はイテレータ(iterator)プロトコルをサポートし、 __next__() メソッドが呼ばれた際に常に文字列を返すような任意のオブジェクトにすることができます — ファイルオブジェクト でもリストでも構いません。**csvfile がファイルオブジェクトの場合、 newline='' として開くべきです**。
18
+
19
+
20
+
21
+ > ####csv.writer(csvfile, dialect='excel', **fmtparams)
22
+
23
+ ユーザが与えたデータをデリミタで区切られた文字列に変換し、与えられたファイルオブジェクトに書き込むための writer オブジェクトを返します。 csvfile は write() メソッドを持つ任意のオブジェクトです。 **csvfile がファイルオブジェクトの場合、 newline='' として開くべきです** 。
24
+
25
+
26
+
27
+ 引用元: [Python 標準ライブラリ » csv — CSV ファイルの読み書き](https://docs.python.jp/3/library/csv.html#module-contents)