简体   繁体   中英

csv writer format cell in python

I write into a csv by this function:

def write_csv(hlavicka: Tuple[str, ...], zaznam: list, pomocne_csv: str) -> None:
    if not os.path.isfile(pomocne_csv):
        with open(pomocne_csv, "w", encoding=cfg.ENCODING, newline="") as soubor:
            writer = csv.writer(soubor, delimiter=cfg.DELIMITER)
            writer.writerow(hlavicka)
    with open(pomocne_csv, "a", encoding=cfg.ENCODING, newline="") as soubor:
        writer = csv.writer(soubor, delimiter=cfg.DELIMITER)
        writer.writerows([zaznam])

However, when I open the csv in MS Office, I see that long numbers are in the scientific notation. For example 102043292003060000 is displayed as 1.02E+17 . Of course, I put 102043292003060000 into my write_csv() function.

The problem is that when I read the csv using:

def generuj_zaznamy(input_path):
    with open(input_path, "r", encoding="cp1250") as file_object:
        reader = csv.reader(file_object, delimiter=";")

        for entry in enumerate(reader, start=1):

            print(entry)

I got 1.02E+17 instead of 102043292003060000 .

Is there a way how to format the cell as a number directly in csv.writer or csv.reader? Thanks a lot.

Using the text editor like notepad.exe to open the csv file, you should see the value of a long numbers accurately. So, the problem comes from office excel but not csv.writer.

If you want to see the long numbers accurately from csv file, you should create a new xlsx file and use the function(Data->Get External Data->From text) to select the csv file for importing, and then choose the data format of the column as Text.

Edited:

I tried the code and it seems that the problem also happens to pandas.DataFrame.to_csv() but not only csv.writer() when the length of the number comes to 20 or more, which is out of the range of np.int64. I readed the offical document and seems that float_format arg can't solve this problems.

The solution I can give now is here, if you can read the original data in string format for the length of the number more than 20:

import numpy as np
import pandas as pd
import csv

df = pd.DataFrame(["3100000035155588379531799826432", "3100000035155588433002733375488", "3100000035155588355694446120960"])
df = "\t" + df
print(df)
df.to_csv("test.csv", index=False, header=False)

rng = np.random.default_rng(0)
big_nums = rng.random(10) * (10**19) # OverflowError while comes to 10**20
df = pd.DataFrame(big_nums, dtype=np.int64).astype(str)
# df = "\t" + df
print(df)
df.to_csv("test.csv", index=False, header=False)

and the output will like that:

                                   0
0  \t3100000035155588379531799826432
1  \t3100000035155588433002733375488
2  \t3100000035155588355694446120960
                      0
0   6369616873214542848
1   2697867137638703104
2    409735239361946880
3    165276355285290944
4   8132702392002723840
5   9127555772777217024
6   6066357757671798784
7   7294965609839983616
8   5436249914654228480
9  -9223372036854775808

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM