質問するログイン新規登録

回答編集履歴

5

追記

2019/01/14 13:34

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  引用元: [Python 標準ライブラリ » csv — CSV ファイルの読み書き](https://docs.python.jp/3/library/csv.html#module-contents)
18
18
 
19
- 実験
19
+ 実験1
20
20
  ---
21
21
  ```Python
22
22
  import csv
@@ -28,7 +28,7 @@
28
28
  [1, 2], [3, 4]
29
29
  ]
30
30
 
31
- #
31
+ # OS標準の改行文字を指定した場合
32
32
  out1 = io.StringIO(newline=os.linesep)
33
33
  csv.writer(out1).writerows(data)
34
34
 
@@ -38,7 +38,7 @@
38
38
  )
39
39
  )
40
40
 
41
- #
41
+ # 空文字列を指定した場合
42
42
  out2 = io.StringIO(newline='')
43
43
  csv.writer(out2).writerows(data)
44
44
 
@@ -62,7 +62,7 @@
62
62
  31 2c 32 0d 0a 33 2c 34 0d 0a
63
63
  ```
64
64
 
65
- **実結果2** [Wandbox](https://wandbox.org/permlink/rejf8PsFeTJfgVIr) ([Linux](https://wandbox.org/permlink/9O0YFquTxKmn1j0N))
65
+ **実結果2** [Wandbox](https://wandbox.org/permlink/rejf8PsFeTJfgVIr) ([Linux](https://wandbox.org/permlink/9O0YFquTxKmn1j0N))
66
66
  ```
67
67
  31 2c 32 0d 0a 33 2c 34 0d 0a
68
68
  31 2c 32 0d 0a 33 2c 34 0d 0a
@@ -70,6 +70,25 @@
70
70
 
71
71
  0dが復帰文字、0aが改行文字です。
72
72
 
73
+ 実験2
74
+ ---
75
+ ```Python
76
+ import csv
77
+
78
+ src = '\x0d' * 10
79
+ data = list(csv.reader(src))
80
+
81
+ print(data)
82
+ ```
83
+
84
+ **実行結果** (Windows)
85
+ ```
86
+ C:...>python tera.py
87
+ [[], [], [], [], [], [], [], [], [], []]
88
+ ```
89
+
90
+ 復帰文字が癌になっていることが分かります。
91
+
73
92
  コードの書き方について
74
93
  ---
75
94
  teratailには、コードを見やすく表示する機能があります。

4

追記

2019/01/14 13:33

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -16,6 +16,60 @@
16
16
 
17
17
  引用元: [Python 標準ライブラリ » csv — CSV ファイルの読み書き](https://docs.python.jp/3/library/csv.html#module-contents)
18
18
 
19
+ 実験
20
+ ---
21
+ ```Python
22
+ import csv
23
+ import io
24
+ import os
25
+
26
+
27
+ data = [
28
+ [1, 2], [3, 4]
29
+ ]
30
+
31
+ #
32
+ out1 = io.StringIO(newline=os.linesep)
33
+ csv.writer(out1).writerows(data)
34
+
35
+ print(
36
+ ' '.join(
37
+ ch.encode().hex() for ch in out1.getvalue()
38
+ )
39
+ )
40
+
41
+ #
42
+ out2 = io.StringIO(newline='')
43
+ csv.writer(out2).writerows(data)
44
+
45
+ print(
46
+ ' '.join(
47
+ ch.encode().hex() for ch in out2.getvalue()
48
+ )
49
+ )
50
+ ```
51
+
52
+ **実行結果1** (手元のWindows)
53
+ ```cmd
54
+ C:...>ver
55
+ Microsoft Windows [Version 10.0.17134.523]
56
+
57
+ C:...>python --version
58
+ Python 3.6.7 :: Anaconda, Inc.
59
+
60
+ C:...>python tera.py
61
+ 31 2c 32 0d 0d 0a 33 2c 34 0d 0d 0a
62
+ 31 2c 32 0d 0a 33 2c 34 0d 0a
63
+ ```
64
+
65
+ **実験結果2** [Wandbox](https://wandbox.org/permlink/rejf8PsFeTJfgVIr) ([Linux](https://wandbox.org/permlink/9O0YFquTxKmn1j0N))
66
+ ```
67
+ 31 2c 32 0d 0a 33 2c 34 0d 0a
68
+ 31 2c 32 0d 0a 33 2c 34 0d 0a
69
+ ```
70
+
71
+ 0dが復帰文字、0aが改行文字です。
72
+
19
73
  コードの書き方について
20
74
  ---
21
75
  teratailには、コードを見やすく表示する機能があります。

3

追記

2019/01/14 13:25

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -6,11 +6,14 @@
6
6
  ```
7
7
 
8
8
  > ####csv.reader(csvfile, dialect='excel', **fmtparams)
9
- 与えられた csvfile 内の行を反復処理するような reader オブジェクトを返します。 csvfile はイテレータ(iterator)プロトコルをサポートし、 __next__() メソッドが呼ばれた際に常に文字列を返すような任意のオブジェクトにすることができます — ファイルオブジェクト でもリストでも構いません。**csvfile がファイルオブジェクトの場合、 newline='' として開くべきです**。
9
+ 与えられた csvfile 内の行を反復処理するような reader オブジェクトを返します。 csvfile はイテレータ(iterator)プロトコルをサポートし、 __next__() メソッドが呼ばれた際に常に文字列を返すような任意のオブジェクトにすることができます — ファイルオブジェクト でもリストでも構いません。**csvfile がファイルオブジェクトの場合、 newline='' として開くべきです**[1]
10
10
 
11
11
  > ####csv.writer(csvfile, dialect='excel', **fmtparams)
12
- ユーザが与えたデータをデリミタで区切られた文字列に変換し、与えられたファイルオブジェクトに書き込むための writer オブジェクトを返します。 csvfile は write() メソッドを持つ任意のオブジェクトです。 **csvfile がファイルオブジェクトの場合、 newline='' として開くべきです** 。
12
+ ユーザが与えたデータをデリミタで区切られた文字列に変換し、与えられたファイルオブジェクトに書き込むための writer オブジェクトを返します。 csvfile は write() メソッドを持つ任意のオブジェクトです。 **csvfile がファイルオブジェクトの場合、 newline='' として開くべきです** [1]
13
13
 
14
+ > ####脚注
15
+ [1] newline='' が指定されない場合、クォートされたフィールド内の改行は適切に解釈されず、書き込み時に \r\n を行末に用いる処理系では余分な \r が追加されてしまいます。csv モジュールは独自 (universal newlines) の改行処理を行うため、newline='' を指定することは常に安全なはずです。
16
+
14
17
  引用元: [Python 標準ライブラリ » csv — CSV ファイルの読み書き](https://docs.python.jp/3/library/csv.html#module-contents)
15
18
 
16
19
  コードの書き方について

2

追記

2019/01/14 13:09

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -11,4 +11,11 @@
11
11
  > ####csv.writer(csvfile, dialect='excel', **fmtparams)
12
12
  ユーザが与えたデータをデリミタで区切られた文字列に変換し、与えられたファイルオブジェクトに書き込むための writer オブジェクトを返します。 csvfile は write() メソッドを持つ任意のオブジェクトです。 **csvfile がファイルオブジェクトの場合、 newline='' として開くべきです** 。
13
13
 
14
- 引用元: [Python 標準ライブラリ » csv — CSV ファイルの読み書き](https://docs.python.jp/3/library/csv.html#module-contents)
14
+ 引用元: [Python 標準ライブラリ » csv — CSV ファイルの読み書き](https://docs.python.jp/3/library/csv.html#module-contents)
15
+
16
+ コードの書き方について
17
+ ---
18
+ teratailには、コードを見やすく表示する機能があります。
19
+ 質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
20
+ ![Python](56957fe805d9d7befa7dba6a98676d2b.gif)
21
+ 特にPythonの場合、インデントが崩れるとコードの意味が変わってしまいます。

1

追記

2019/01/14 13:08

投稿

LouiS0616
LouiS0616

スコア35678

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