une bibliothèque Java IO en python?

10 réponses

je pensais à quelque chose de plus le long des lignes de:

File f = File.open("C:/Users/File.txt");

for(String s : f){
   System.out.println(s);
}

Voici mon code source:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;

public abstract class File implements Iterable<String>{
    public final static String READ = "r";
    public final static String WRITE = "w";

    public static File open(String filepath) throws IOException{
        return open(filepath, READ);
    }   

    public static File open(String filepath, String mode) throws IOException{
    if(mode == READ){
        return new ReadableFile(filepath);
    }else if(mode == WRITE){
        return new WritableFile(filepath);
    }
    throw new IllegalArgumentException("Invalid File Write mode '" + mode + "'");
    }

    //common methods
    public abstract void close() throws IOException;

    // writer specific
    public abstract void write(String s) throws IOException;

}

class WritableFile extends File{
    String filepath;
    Writer writer;

    public WritableFile(String filepath){
        this.filepath = filepath;
    }

    private Writer writer() throws IOException{
        if(this.writer == null){
            writer = new BufferedWriter(new FileWriter(this.filepath));
        }
        return writer;
    }

    public void write(String chars) throws IOException{
        writer().write(chars);
    }

    public void close() throws IOException{
        writer().close();
    }

    @Override
    public Iterator<String> iterator() {        
        return null;
    }
}

class ReadableFile extends File implements Iterator<String>{
    private BufferedReader reader;
    private String line;    
    private String read_ahead;

    public ReadableFile(String filepath) throws IOException{        
        this.reader = new BufferedReader(new FileReader(filepath)); 
        this.read_ahead = this.reader.readLine();
    }

    private Reader reader() throws IOException{
         if(reader == null){
               reader = new BufferedReader(new FileReader(filepath));   
         }
         return reader;
    }

    @Override
    public Iterator<String> iterator() {
        return this;
    }

    @Override
    public void close() throws IOException {
        reader().close();
    }

    @Override
    public void write(String s) throws IOException {
        throw new IOException("Cannot write to a read-only file.");
    }

    @Override
    public boolean hasNext() {      
        return this.read_ahead != null;
    }

    @Override
    public String next() {
        if(read_ahead == null)
            line = null;
        else
            line = new String(this.read_ahead);

        try {
            read_ahead = this.reader.readLine();
        } catch (IOException e) {
            read_ahead = null;
            reader.close()
        }
        return line;
    }

    @Override
    public void remove() {
        // do nothing       
    }
}

et voici le test unitaire pour:

import java.io.IOException;
import org.junit.Test;

public class FileTest {
    @Test
    public void testFile(){
        File f;
        try {
            f = File.open("File.java");
            for(String s : f){
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testReadAndWriteFile(){
        File from;
        File to;
        try {
            from = File.open("File.java");
            to = File.open("Out.txt", "w");
            for(String s : from){           
                to.write(s + System.getProperty("line.separator"));
            }
            to.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }   
    }
}
19
répondu drozzy 2010-08-12 00:27:26

Lecture d'un fichier ligne par ligne en Java:

BufferedReader in = new BufferedReader(new FileReader("myfile.txt"));

String line;
while ((line = in.readLine()) != null) {
    // Do something with this line
    System.out.println(line);
}

in.close();

la plupart des classes d'e/s sont dans le paquet java.io. Voir la documentation de L'API pour ce paquet. Jetez un oeil à Java de Sun I/O tutoriel pour plus d'informations.

ajout: L'exemple ci-dessus va utiliser le codage de caractères par défaut de votre système pour lire le fichier texte. Si vous voulez spécifier explicitement le codage de caractères, par exemple UTF-8, changez le premier ligne à ceci:

BufferedReader in = new BufferedReader(
    new InputStreamReader(new FileInputStream("myfile.txt"), "UTF-8"));
11
répondu Jesper 2010-06-07 20:56:30

Si vous avez déjà des dépendances Apache commons lang et communes io ce qui pourrait être une alternative:

String[] lines = StringUtils.split(FileUtils.readFileToString(new File("myfile.txt")), '\n');
for(String line: lines){
      //do something with the line from file
}

(je préfère Jesper réponse)

4
répondu stacker 2010-05-10 13:29:06

si vous voulez itérer à travers un fichier par des chaînes, une classe que vous pourriez trouver utile est le Scanner classe.

import java.io.*;
import java.util.Scanner;

    public class ScanXan {
        public static void main(String[] args) throws IOException {
            Scanner s = null;
            try {
                s = new Scanner(new BufferedReader(new FileReader("myFile.txt")));

                while (s.hasNextLine()) {
                    System.out.println(s.nextLine());
                }
            } finally {
                if (s != null) {
                    s.close();
                }
            }
        }
    }

L'API est assez utile: http://java.sun.com/javase/7/docs/api/java/util/Scanner.html Vous pouvez également analyser le fichier en utilisant des expressions régulières.

4
répondu Grantismo 2010-05-19 13:36:50

Je ne me lasse jamais du proxénétisme de Google goyave, les bibliothèques, ce qui prend beaucoup de la douleur... la plupart des choses à Java.

Que Diriez-vous de:

for (String line : Files.readLines(new File("file.txt"), Charsets.UTF_8)) {
   // Do something
}

dans le cas où vous avez un gros fichier, et que vous voulez un rappel ligne par ligne (plutôt que de lire le tout en mémoire), vous pouvez utiliser un LineProcessor, ce qui ajoute un peu de boilerplate (en raison de l'absence de fermetures... soupir), mais encore vous protège de traiter avec la lecture elle-même, et tous les associés Exceptions:

int matching = Files.readLines(new File("file.txt"), Charsets.UTF_8, new LineProcessor<Integer>(){
  int count;

  Integer getResult() {return count;}

  boolean processLine(String line) {
     if (line.equals("foo")
         count++;
     return true;
  }
});

si vous ne voulez pas réellement un résultat de retour hors du processeur, et vous n'abandonnez jamais prématurément (la raison pour le retour booléen de processLine) faire quelque chose comme:

class SimpleLineCallback extends LineProcessor<Void> {
    Void getResult{ return null; }

    boolean processLine(String line) {
       doProcess(line);
       return true;
    }

    abstract void doProcess(String line);
}

et puis votre code pourrait être:

Files.readLines(new File("file.txt"), Charsets.UTF_8, new SimpleLineProcessor(){
  void doProcess(String line) {
     if (line.equals("foo");
         throw new FooException("File shouldn't contain 'foo'!");
  }
});

qui est donc plus propre.

3
répondu Cowan 2010-05-19 21:03:11
  public static void main(String[] args) throws FileNotFoundException {
    Scanner scanner = new Scanner(new File("scan.txt"));
    try {
      while (scanner.hasNextLine()) {
        System.out.println(scanner.nextLine());
      }
    } finally {
      scanner.close();
    }
  }

Quelques mises en garde:

2
répondu McDowell 2010-05-23 11:11:37

exemple Simple utilisant Files.readLines() à partir de goyave-io avec un LineProcessor rappel:

import java.io.File;
import java.io.IOException;

import com.google.common.base.Charsets;
import com.google.common.io.Files;
import com.google.common.io.LineProcessor;

public class GuavaIoDemo {

    public static void main(String[] args) throws Exception {
        int result = Files.readLines(new File("/home/pascal/.vimrc"), //
            Charsets.UTF_8, // 
            new LineProcessor<Integer>() {
                int counter;

                public Integer getResult() {
                    return counter;
                }

                public boolean processLine(String line) throws IOException {
                    counter++;
                    System.out.println(line);
                    return true;
                }
            });
    }
}
1
répondu Pascal Thivent 2010-05-19 16:18:02

Vous pouvez utiliser python qui vous permet d'exécuter la syntaxe Python en Java.

0
répondu Nathan Voxland 2010-05-19 05:36:40

bel exemple ici: itération ligne par ligne

0
répondu Goibniu 2010-05-19 08:57:18

Essayez de regarder groovy!

C'est un super-ensemble de Java qui fonctionne en HTE JVM. Le code Java le plus valide est également valide Groovy de sorte que vous avez accès à l'un des millions D'API java directement.

en outre, il a beaucoup des contructs de niveau supérieur familiers aux Pythonistes, plus un certain nombre d'extensions pour enlever la douleur des cartes, listes, sql, xml et vous l'avez deviné -- fichier IO.

0
répondu James Anderson 2010-05-25 10:48:27