delhi09の勉強日記

技術トピック専用のブログです。自分用のメモ書きの投稿が多いです。あくまで「勉強日記」なので記事の内容は鵜呑みにしないでください。

Pythonのファイルの読み込みは改行コードが含まれる

Pythonでは1行ずつファイル読み込みを行うと、改行コードが付いたままの状態で読み込まれる仕様である。
JavaPHPをやってた人間としては、慣れるまで違和感があったのでメモしておく。

(例)
以下のファイルを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']


対して、JavaPHPではファイルを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();
		}
	}

}