Pythonでは1行ずつファイル読み込みを行うと、改行コードが付いたままの状態で読み込まれる仕様である。
Java、PHPをやってた人間としては、慣れるまで違和感があったのでメモしておく。
(例)
以下のファイルをPythonで1行ずつ読み込んでリストを作成する。
[sample.txt]
aaa bbb ccc
以下のように素直に処理するとリストの要素に改行コードが含まれてしまう。
rows = [] with open('sample.txt', encoding='utf-8') as f: for row in f: rows.append(row) print(rows) # ['aaa\n', 'bbb\n', 'ccc']
従って、改行コードを含まないリストが欲しい場合は以下のように改行コードを削除してからリストに追加する必要がある。
rows = [] with open('sample.txt', encoding='utf-8') as f: for row in f: rows.append(row.rstrip()) print(rows) # ['aaa', 'bbb', 'ccc']
※ rstrip()は文字列の末尾部分を除去した文字列を返す関数。引数を指定しない場合は空白文字を除去する。
https://docs.python.org/ja/3/library/stdtypes.html?highlight=strip
また、Pythonにはreadlines()というリストに1行ずつ格納した状態で返してくれる関数も存在するが、こちらも改行コードを含んだ状態でリスト化する。
従って、改行コードを含まないリストが欲しい場合は、結局リストをループして改行コードを削除することになるので、前の処理と比べてコード量は減らない。
rows = [] with open('sample.txt', encoding='utf-8') as f: rows = f.readlines() print(rows) # ['aaa\n', 'bbb\n', 'ccc'] # 改行コードを削除するためにリストのループが必要 for i, row in enumerate(rows): rows[i] = row.rstrip() print(rows) # ['aaa', 'bbb', 'ccc']
対して、Java、PHPではファイルを1行ずつ読み込む際には改行コードは含まれない。
■PHP
・ファイルを1行ずつ読んで配列にする。
<?php $rows = []; $fp = fopen('sample.txt', 'r'); while(!feof($fp)) { $rows[] = fgets($fp); } fclose($fp); print_r($rows); /* Array ( [0] => aaa [1] => bbb [2] => ccc ) */
・ファイルを1行ずつの配列に保存する。
<?php print_r(file('sample.txt')); /* Array ( [0] => aaa [1] => bbb [2] => ccc ) */
■Java
・ファイルを1行ずつ読んで配列にする。
import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] arags) { try (BufferedReader br = new BufferedReader(new FileReader(new File("sample.txt")))) { List<String> rows = new ArrayList<>(); String row; while ((row = br.readLine()) != null) { rows.add(row); } System.out.println(rows); // [aaa, bbb, ccc] } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
・ファイルを1行ずつの配列に保存する。
import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; public class Main { public static void main(String[] args) { try { List<String> lines = Files.readAllLines(Paths.get("sample.txt"), StandardCharsets.UTF_8); System.out.println(lines); // [aaa, bbb, ccc] } catch (IOException e) { e.printStackTrace(); } } }